在Shiny中搜索多个Datatable列

时间:2016-03-17 20:52:11

标签: r shiny dt

我目前正在尝试创建一个R闪亮的应用程序,用户可以搜索每行中的多个列。此功能使用闪亮环境之外的datatable包中的DT函数。以iris数据集为例,我想搜索包含值的所有行; 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)
      )
    }
  )
}

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

2 个答案:

答案 0 :(得分:2)

对于server=FALSE renderDataTable函数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 ) } ) } ,您需要遇到同样问题的其他人。

chart.export = {
enabled: true,
position: "bottom-right"
}
chart.initHC = false;
chart.validateNow();

答案 1 :(得分:1)

更新:我已在服务器端处理模式下实施smart filtering,默认情况下已启用。使用 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'))
    )
  }
)

smart filtering in DT in the server mode

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

您可以在搜索中启用正则表达式(see more examples in the DT documentation)。

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.5, 1.4”。如果您需要在第一列中找到5.1,在第二列中找到3.5,在第三列中找到1.4,则在使用单个搜索字符串的服务器端处理模式中无法执行此操作(单个正则表达式无法表达这个)。您必须使用客户端处理(即server = FALSE,如您所发现的),或者对列进行排序以找到所需的组合:

regex in DT

或使用列过滤器过滤各列:

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

column filters in DT