从R Shiny Datatable中提取过滤器

时间:2018-10-17 15:49:28

标签: r shiny shinydashboard dt

我在R Shiny中有一个DT data table,并且通过在filter="top"中设置renderDT()启用了列过滤。现在,我想提取用户应用的过滤器,以便将它们保存在服务器端变量中,并在(例如)数据库更新(需要更新表)时重新应用它们。

这是使用Shiny Dashboard的MWE:

library(shiny)           #  Shiny web app
library(shinydashboard)  #  Dashboard framework for Shiny
library(plotly)          #  Plotly interactive plots
library(DT)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    fluidRow(column(12, DTOutput("table")))
  )
)

server <- function(input, output, session) {
  fileData <- reactiveFileReader(1000, session, 'test.csv', read.csv)
  output$table <- renderDT(fileData(), filter = "top")
}

shinyApp(ui, server)

重申一下,我想将过滤器(例如,用户可以从一个过滤器框中选择一个数值范围或特定因子)保存为input$变量,以便我可以使用它们在服务器端。

2 个答案:

答案 0 :(得分:2)

我认为最简单的方法就是添加

options = list(stateSave = TRUE)
renderDT()函数内部

。然后,在server内,可以随时使用input$<tableID>_state访问表的状态(我的表仅被称为“表”,因此它变为input$table_state

observeEvent(input$table_state, {
  str(input$table_state)
})

那么整个解决方案是:

library(shiny)
library(shinydashboard)
library(plotly)
library(DT)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    box(DTOutput("table"))
  )
)

server <- function(input, output, session) {
  fileData <- reactiveFileReader(1000, session, 'www/test.csv', read.csv)
  output$table <- renderDT(fileData(), filter = "top",
    options = list(stateSave = TRUE))

  observeEvent(input$table_state, {
    str(input$table_state)
  })

}

shinyApp(ui, server)

RStudio控制台中的示例输出:

List of 6
 $ time   : num 1.54e+12
 $ start  : int 0
 $ length : int 10
 $ order  : list()
 $ search :List of 4
  ..$ search         : chr ""
  ..$ smart          : logi TRUE
  ..$ regex          : logi FALSE
  ..$ caseInsensitive: logi TRUE
 $ columns:List of 5
  ..$ :List of 2
  .. ..$ visible: logi TRUE
  .. ..$ search :List of 4
  .. .. ..$ search         : chr ""
  .. .. ..$ smart          : logi TRUE
  .. .. ..$ regex          : logi FALSE
  .. .. ..$ caseInsensitive: logi TRUE
  ..$ :List of 2
  .. ..$ visible: logi TRUE
  .. ..$ search :List of 4
  .. .. ..$ search         : chr "[\"0\"]"
  .. .. ..$ smart          : logi TRUE
  .. .. ..$ regex          : logi FALSE
  .. .. ..$ caseInsensitive: logi TRUE
  ..$ :List of 2
  .. ..$ visible: logi TRUE
  .. ..$ search :List of 4
  .. .. ..$ search         : chr "[\"8\"]"
  .. .. ..$ smart          : logi TRUE
  .. .. ..$ regex          : logi FALSE
  .. .. ..$ caseInsensitive: logi TRUE
  ..$ :List of 2
  .. ..$ visible: logi TRUE
  .. ..$ search :List of 4
  .. .. ..$ search         : chr ""
  .. .. ..$ smart          : logi TRUE
  .. .. ..$ regex          : logi FALSE
  .. .. ..$ caseInsensitive: logi TRUE
  ..$ :List of 2
  .. ..$ visible: logi TRUE
  .. ..$ search :List of 4
  .. .. ..$ search         : chr ""
  .. .. ..$ smart          : logi TRUE
  .. .. ..$ regex          : logi FALSE
  .. .. ..$ caseInsensitive: logi TRUE

请注意search列表,其中显示了应用于各列的过滤器。

奖金

要进行超级轻松的过滤器提取,请使用input$table_search_columns。与使用sapply的结果相同:

sapply(input$table_state$columns, function(x) x$search$search)

这将给出类似

[1] ""        "[\"0\"]" "[\"8\"]" ""        ""      
对于上面的示例,为

答案 1 :(得分:1)

执行此操作可能更简单,但这是我的5分钟快速解决方案:

每次重新绘制表格时(在更新过滤器时都会发生,但在排序,分页或执行任何其他导致重绘的操作时也会发生),请注入一些javascript,以查找所需的过滤器值感兴趣。我们可以使用this method然后将值作为输入发送到R中闪亮应用的服务器端。

我将使用mtcars数据集而不是csv文件,我使用的模板比您提供的模板要简单一些,我将专门寻找第三列的过滤值{ {1}}。这应该足以帮助您解决特定情况。

disp

编辑:@awwsmm的另一个答案更好,这个答案更多是基于javascript的,另一个答案更闪亮