首页 > 解决方案 > 从 R Shiny Datatable 中提取过滤器

问题描述

我在 R Shiny 中有一个DT 数据表,并且我通过设置 inside 启用了列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$变量,以便我可以在服务器端使用它们。

标签: rshinyshinydashboarddt

解决方案


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

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\"]" ""        ""      

对于上面的例子。


推荐阅读