我在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$
变量,以便我可以使用它们在服务器端。
答案 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)
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的,另一个答案更闪亮