【问题标题】:Column still shows a filter after clear using the DT package in R Shiny使用 R Shiny 中的 DT 包清除后,列仍显示过滤器
【发布时间】:2019-05-08 06:34:48
【问题描述】:

Google Chrome 和 Firefox 都会出现此问题,但在 Internet Explorer 中似乎没问题。如果我有一个启用了因子列和过滤器的数据表,我可以选择要过滤的列中的哪些因子。然后如果我通过代理清除过滤器,表格会重置,但是如果我点击过滤器输入,它仍然显示过滤器被选中,即使它确实不是。

library(shiny)
library(DT)

ui <- fluidPage(
  fluidRow(column(2, DTOutput("table"))),
  fluidRow(actionButton("clear", "Clear Filters"))
)

server <- function(input, output, session) {

  data <- data.frame(LETTERS = c("A", "B", "C"))

  output$table <- renderDT({datatable(data, filter = list(position = "top", clear = FALSE))})

  observeEvent(input$clear, {
    clearSearch(proxy = dataTableProxy("table"))
  })

}

shinyApp(ui = ui, server = server)

这里的表格是按“A”过滤的

然后通过单击“清除过滤器”按钮通过代理清除过滤器,表格取消过滤,“A”上的过滤器似乎消失了。

但是,单击过滤器框会显示“A”仍然是一个选定的过滤器,尽管它实际上不是。

这是可以在 DT 包中修复的问题,还是 Chrome 和 Firefox 的问题?

【问题讨论】:

    标签: r shiny dt


    【解决方案1】:

    通过在 javascript 中创建一个函数来清除客户端上的过滤器输入,然后在从 DT 运行 clearSearch 函数后调用该函数来解决此问题。为简单起见,我创建了一个名为 clearColumnSearch 的包装器函数,它兼具两者。

    library(shiny)
    library(DT)
    
    clearColumnSearch <- function(proxy) {
      clearSearch(proxy = proxy)
      proxy$session$sendCustomMessage(type = "clearColumnSearch", message = list(tableid = proxy$id))
    }
    
    ui <- fluidPage(
      fluidRow(column(2, DTOutput("table"))),
      fluidRow(actionButton("clear", "Clear Filters")),
      tags$script(HTML("Shiny.addCustomMessageHandler('clearColumnSearch',
      function(x) {
        // outputId of the DT element
        var table = document.getElementById(x.tableid);
        // filter row of the table element within the DT element
        var tablerow = table.getElementsByTagName('table')[0].rows[1];
        // loop through each cell in the filter row
        for (var i = 0, cell; cell = tablerow.cells[i]; i++) {
          if(['factor', 'logical'].includes(cell.getAttribute('data-type'))) {
            // find the selectize object
            var dropdown = $(cell).find('.selectized').eq(0)[0].selectize;
            // set to blank
            dropdown.setValue('');
          } else if(['number', 'integer', 'date', 'time'].includes(cell.getAttribute('data-type'))) {
            // find the slider object
            var slider = $(cell).find('.noUi-target').eq(0);
            // get the endpoints of the slider
            var min = slider.noUiSlider('options')['range']['min'];
            var max = slider.noUiSlider('options')['range']['max'];
            // set the value of the slider
            slider.val([min, max]);
          } else {}
        }
    });"))
    )
    
    server <- function(input, output, session) {
    
      data <- data.frame(LETTERS = c("A", "B", "C"))
    
      output$table <- renderDT({datatable(data, filter = list(position = "top", clear = FALSE))})
    
      observeEvent(input$clear, {
        clearColumnSearch(proxy = dataTableProxy("table"))
      })
    
    }
    
    shinyApp(ui = ui, server = server)    
    

    【讨论】:

      猜你喜欢
      • 2020-03-02
      • 2016-04-24
      • 2019-07-17
      • 2019-03-19
      • 2021-03-27
      • 2021-11-20
      • 2021-03-17
      • 2017-08-23
      • 2016-07-03
      相关资源
      最近更新 更多