Пользовательский фильтр DT SearchPanes

#r #shiny #dt

#r #блестящий #dt

Вопрос:

Я пытаюсь сделать что-то вроде того, что показано здесь, но мне трудно понять, как это сделать в Shiny. В качестве примера было бы здорово иметь фильтр для mtcars «эффективных» (автомобили с по крайней мере 15 миль на галлон) или «неэффективных» (автомобили с менее чем 15 миль на галлон).

Вот некоторый код:

 library(shiny)
library(DT)

ui <- shinyUI(
  fluidPage(DT::dataTableOutput("mtcars_table"))
)

server <- shinyServer(function(input, output, session) {
  output$mtcars_table <- 
    DT::renderDT({
      DT::datatable(
        mtcars,
        options = list(dom = 'Pfrtip', 
                       columnDefs = list(
                         list(
                           searchPanes = list(show = TRUE), targets = 1
                         ),
                         list(
                           searchPanes = list(show = FALSE), targets = 2:11
                         ))),
        extensions = c('Select', 'SearchPanes'),
        selection = 'none'
      )
      
    }, server = FALSE)
})

shinyApp(ui = ui, server = server)
 

Ответ №1:

Вот что можно попробовать, основываясь на примере таблиц данных с пользовательскими параметрами фильтрации.

Для дополнительных list опций я включил метку типа «Эффективный», а также функцию javascript для value ( rowData[1] должна ссылаться на первый столбец, mpg ).

 library(shiny)
library(DT)

ui <- shinyUI(
  fluidPage(DT::dataTableOutput("mtcars_table"))
)

server <- shinyServer(function(input, output, session) {
  output$mtcars_table <- 
    DT::renderDT({
      DT::datatable(
        mtcars,
        options = list(
          dom = 'Pfrtip', 
          columnDefs = list(
            list(
              searchPanes = list(
                show = TRUE,
                options = list(
                  list(
                    label = "Efficient",
                    value = JS(
                      "function(rowData, rowIdx) { return rowData[1] >= 15; }"
                    )
                  ),
                  list(
                    label = "Inefficient",
                    value = JS(
                      "function(rowData, rowIdx) { return rowData[1] < 15; }"
                    )
                  )
                )
              ),
              targets = 1
            ),
            list(
              searchPanes = list(show = FALSE), targets = 2:11
            )
          )
        ),
        extensions = c('Select', 'SearchPanes'),
        selection = 'none'
      )
    }, server = FALSE)
})

shinyApp(ui = ui, server = server)
 

Комментарии:

1. Мне нравится этот пример, спасибо. Вы случайно не знаете, как управлять высотой области поиска? Мой такой большой, и это заставляет DT быть маленьким! Спасибо — JJ

2. @user2863275 Попробуйте добавить некоторые пользовательские css в ui , например: ui <- fluidPage(tags$style(HTML('div.dtsp-searchPane div.dataTables_scrollBody {height: 80px !important;}')), mainPanel(DT::dataTableOutput('mtcars_table')))

3. Это сделало свое дело. Я подумал об использовании тех же тегов после прочтения этого datatables.net/forums/discussion/67406/searchpanes-height если вы посмотрите на последнее сообщение на странице. Наверное, я не понимаю, когда использовать теги $style(HTML()) и DT::JS(), потому что я думал, что для реализации этих команд в searchPane() нужен какой-то специальный DT::JS() . Есть хорошие ссылки, чтобы узнать, как реализовать эти стили?

4. Я тоже видел эту запись на форуме, которая была полезной. Для встроенного использования css в блестящих приложениях см. Это или это или, может быть, это … надеюсь, они могут быть полезны и удачи!

5. Хорошие источники! Но намного проще, чем доступ к элементам DT. Придется поработать над интерпретацией и использованием. Спасибо 🙏