Я разрабатываю блестящее приложение, в котором пользователь может выбрать несколько столбцов в большом наборе данных, чтобы создать подмножество этого набора данных. Я использую пакет DT, чтобы красиво визуализировать таблицу в блестящем приложении.

Ранее я использовал версию 0.2 пакета DT, где работал следующий код:

library("DT")
library("shiny")

ui <- fluidPage(
  DT::dataTableOutput('table1'),
  DT::dataTableOutput("table2")
)

server <- function(input, output) {
  output$table1 <- DT::renderDataTable({
    datatable(mtcars, extensions = 'Select', selection = 'none', options = list(ordering = FALSE, searching = FALSE, pageLength = 25, select = list(style = 'os', items = 'column')),
              callback = JS(
                "table.on( 'click.dt', 'tbody td', function (e) {",
                "var type = table.select.items();",
                "var idx = table[type + 's']({selected: true}).indexes().toArray();",
                "var DT_id = table.table().container().parentNode.id;",
                "Shiny.onInputChange(DT_id + '_columns_selected', idx);",
                "})"
              ))
  })

  output$table2 <- DT::renderDataTable({
    subset_table <- mtcars[,input$table1_columns_selected]
    datatable(subset_table)
  })
}

shinyApp(ui = ui, server = server)

К сожалению, этот код больше не работает (сейчас у меня версия 0.4). input$table1_columns_selected не отображает индексы выбранных столбцов. Согласно этому https://rstudio.github.io/DT/shiny.html теперь есть возможность выбирать несколько строк, но я не могу понять, как сделать то же самое со столбцами.

Любая идея ? Спасибо большое за помощь !

1
Bambs 21 Сен 2018 в 16:57

2 ответа

Лучший ответ

Я не уверен, почему для этого нужно использовать аргумент обратного вызова. Вот упрощенный подход -

library("DT")
library("shiny")

ui <- fluidPage(
  DT::dataTableOutput('table1'),
  DT::dataTableOutput("table2")
)

server <- function(input, output) {
  output$table1 <- DT::renderDataTable({
    datatable(mtcars, extensions = 'Select', selection = list(target = "column"), options = list(ordering = FALSE, searching = FALSE, pageLength = 25))
  })

  output$table2 <- DT::renderDataTable({
    subset_table <- mtcars[, input$table1_columns_selected, drop = F]
    datatable(subset_table)
  })
}

shinyApp(ui = ui, server = server)

Обратите внимание на изменение аргументов datatable в output$table1. Надеюсь, это то, что вы искали.

1
Shree 22 Сен 2018 в 02:09

Я протестировал ваш код, и он у меня работает нормально (см. Рисунок ниже), а также использую пакет DT версии 0.4.

Итак, я предполагаю, что проблема не в пакете DT, а в чем-то другом в вашей глобальной конфигурации, которая вызывает проблему.

enter image description here

0
Abdella Mohamed 21 Сен 2018 в 14:23