[英]Persistent column filters with Shiny DT
我正在尝试采用这种方法来捕获 DT 的列搜索词响应,并在表因响应数据对象更新而刷新时重新应用它们。 我无法找出实现这一目标的正确配方。 可重现的例子:
require(shiny)
require(dplyr)
require(stringr)
require(DT)
d = tibble(sentence = sentences, chars = nchar(sentence), grp = sample(LETTERS, length(sentences), replace = TRUE))
default_search = ''
ui <- fluidPage(
selectInput("grp", 'group', choices = LETTERS, selected = NULL),
DTOutput("data_tbl")
)
server <- function(input, output, session) {
r = reactiveValues(group = NULL, lines = NULL, search_columns = NULL)
proxy <- dataTableProxy('data_tbl')
observeEvent(input$grp, {
r$data = d %>% filter(grp == input$grp)
})
output$data_tbl <- renderDT(filter = "top", {
r$data %>% select(-grp)
}, options = list(stateSave = TRUE))
# catch column search terms
observeEvent(input$data_tbl_search_columns, {
if(is.null(input$data_tbl_search_columns)) return()
if(input$data_tbl_search_columns[1] != '') {
proxy %>% updateSearch(keywords = list(global = default_search, columns = c('', isolate(input$data_tbl_search_columns))))
}
})
}
shinyApp(ui, server)
预期的结果是:
我得到了一些坚持,但结果是错误的。 并且从搜索窗口中省略过滤项。 任何帮助表示赞赏。
诀窍是您的observeEvent
取决于不断变化的数据,而不是列搜索词。 我还添加了存储全局搜索词的功能。
require(shiny)
require(dplyr)
require(stringr)
require(DT)
d = tibble(sentence = sentences, chars = nchar(sentence), grp = sample(LETTERS, length(sentences), replace = TRUE))
default_search = ''
ui <- fluidPage(
selectInput("grp", 'group', choices = LETTERS, selected = NULL),
DTOutput("data_tbl")
)
server <- function(input, output, session) {
r = reactiveValues(group = NULL, lines = NULL, search_columns = NULL)
proxy <- dataTableProxy('data_tbl')
observeEvent(input$grp, {
r$data = d %>% filter(grp == input$grp)
})
output$data_tbl <- renderDT(filter = "top", {
r$data %>% select(-grp)
})
# catch column search terms
observeEvent(r$data, {
if(is.null(input$data_tbl_search_columns)) return()
if(input$data_tbl_search_columns[1] != '') {
proxy %>% updateSearch(keywords = list(global = isolate(input$data_tbl_search),
columns = c("", isolate(input$data_tbl_search_columns))))
}
})
}
shinyApp(ui, server)
我不确定这是否是所需的行为,在您的if
条件下,第二个过滤器不会被存储。 至少在这个 reprex 中,您实际上不需要reactiveValues
但可以将数据直接存储在reactive
,然后您可以保存一个观察者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.