1

我目前正在尝试制作一个 R 闪亮的应用程序,用户可以在其中搜索每行中的多个列。此功能使用闪亮环境之外的包中的datatable功能工作。DTiris数据集为例,我想搜索包含值的所有行;5.1、3.5 和 1.4。如果我在交互式数据表窗口“5.1 3.5 1.4”的搜索框中键入以下字符串,则会显示第 1 行和第 18 行。

library(DT)
head(iris)

#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa


datatable(iris)

问题是当我尝试在闪亮的环境中做同样的事情时,我收到了消息

未找到匹配的记录。

例如:

if (interactive()) {
  library(shiny)
  shinyApp(
    ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
    server = function(input, output) {
      output$tbl = DT::renderDataTable(
        iris, options = list(lengthChange = FALSE)
      )
    }
  )
}

有没有人有解决方法,或者可以告诉我我做错了什么?

4

2 回答 2

2

更新:我已经在服务器端处理模式下实现了智能过滤,默认情况下是启用的。使用DT >= 0.2.29,它应该开箱即用:

devtools::install_github('rstudio/DT')
library(shiny)
shinyApp(
  ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
  server = function(input, output) {
    output$tbl = DT::renderDataTable(
      iris, options = list(search = list(search = '5.1 3.5 1.4'))
    )
  }
)

服务器模式下 DT 中的智能过滤


您可以忽略下面的旧答案。

您可以在搜索中启用正则表达式(参见DT文档中的更多示例)。

library(shiny)
shinyApp(
  ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
  server = function(input, output) {
    output$tbl = DT::renderDataTable(
      iris, options = list(search = list(regex = TRUE))
    )
  }
)

在上面的例子中,我使用了正则表达式5.1|3.5|1.4请注意,这意味着“在任何列中查找值 5.1、3.51.4 ”。如果需要在第一列查找5.1,在第二列查找3.5,在第三列查找1.4,在服务端处理的模式下,用单个搜索字符串是没有办法的(单个正则表达式无法表达)这个)。您必须使用客户端处理(即,正如您所发现的那样),或者对列进行排序以找到您需要的组合:server = FALSE

DT 中的正则表达式

或使用列过滤器过滤单个列:

library(shiny)
shinyApp(
  ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
  server = function(input, output) {
    output$tbl = DT::renderDataTable(
      iris, filter = 'top'
    )
  }
)

DT 中的列过滤器

于 2018-01-06T17:28:57.490 回答
2

对于其他有相同问题的人,您需要使用server=FALSErenderDataTable功能。

if (interactive()) {
  library(shiny)
  shinyApp(
    ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
    server = function(input, output) {
      output$tbl = DT::renderDataTable(
        iris, options = list(lengthChange = FALSE), server = FALSE
      )
    }
  )
}
于 2016-03-17T21:16:21.220 回答