【问题标题】:Persistent column filters with Shiny DT带有 Shiny DT 的持久柱过滤器
【发布时间】:2021-02-04 23:27:06
【问题描述】:

我正在尝试调整 this method 以捕获 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)

预期的结果是:

  1. 用户在 "sentence" 字段中添加搜索过滤器,例如“这”。该表过滤到匹配的记录。
  2. 用户更改 grp 选择以更改数据。表格会刷新,但 (i) 搜索词会保留在过滤器窗口中,并且 (ii) 表格会被相应地过滤。

我得到了一些坚持,但结果是错误的。并且从搜索窗口中省略了过滤词。任何帮助表示赞赏。

【问题讨论】:

  • updateSearch 中的错误:找不到对象“default_search”
  • 抱歉@HubertL 缺少行。现在工作

标签: r shiny dt


【解决方案1】:

诀窍在于您的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 中,然后您可以保存一个观察者。

【讨论】:

  • 成功了。所以我只是有错误的反应:/谢谢@starja :)
猜你喜欢
  • 1970-01-01
  • 2020-03-02
  • 2021-03-27
  • 2018-12-09
  • 2019-07-17
  • 2021-11-20
  • 2019-03-19
  • 2021-03-17
  • 2011-01-06
相关资源
最近更新 更多