r - 从 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$
变量,以便我可以在服务器端使用它们。
解决方案
我认为最简单的方法就是添加
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\"]" "" ""
对于上面的例子。
推荐阅读
- r - 将最接近的值返回到 R 中的特定列
- android - 如何在 ConstrainLayout 中的两个视图之间添加百分比边距
- java - Docker compose Redis 和 Spring boot app: java.net.ConnectException: Connection denied (Connection denied)",
- react-native - React Native Expo 在错误的地方寻找 node_modules
- r - Rstudio 中 dplyr 的“bind_rows”期间数据层次结构中缺少名称 - 获取 Okex Ticker
- c - 如何处理 roslaunch 期间发生的 RLException 错误?
- node.js - 将原始 http 响应转换为 Koa 兼容对象?
- java - ArchUnit 确保注释存在
- intellij-idea - 为什么即使没有进行任何更改,IntelliJ IDEA 也会更新资源?
- c# - Microsoft.VisualBasic.FileIO 参考