Столбец по-прежнему показывает фильтр после очистки с использованием пакета DT в R Shiny - PullRequest
0 голосов
/ 06 декабря 2018

Эта проблема возникает как в 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»

enter image description here

Затем нажмите кнопку «Очистить фильтры», чтобы очистить фильтры по прокси, таблица не фильтруется и фильтрна «А», похоже, больше нет.

enter image description here

Однако, щелчок в поле фильтра покажет «А» как выбранный фильтр, хотяэто действительно не так.

enter image description here

Это что-то, что можно было бы даже исправить в пакете DT, или это проблема с Chrome и Firefox?

1 Ответ

0 голосов
/ 10 августа 2019

Это было решено созданием функции в javascript для очистки входных данных фильтра на стороне клиента, которые затем вызывались после запуска функции clearSearch из DT.Для простоты я создал функцию-обертку с именем 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)    
...