R реагирующий — развернуть / разгруппировать группы отдельных элементов, созданные groupBy()

#r #shiny #reactable

#r #блестящий #с возможностью реагирования

Вопрос:

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

 library(reactable)
library(data.table)

data <- setDT(MASS::Cars93[10:22, c("Manufacturer", "Model", "Type", "Price", "MPG.city")])

reactable(data, groupBy = "Manufacturer")
  

Пример 1
В приведенной выше таблице показана только одна запись в Chrylser — я бы хотел, чтобы она автоматически расширялась или в идеале вообще не имела стрелки расширения и отображала всю информацию в одной строке.

Какой-то запутанный код создает таблицу, которая показывает примерно то, что я хочу:

 data_unique <- unique(data, by = "Manufacturer")
data_dups <- unique(data[duplicated(data, by = "Manufacturer")]$Manufacturer)
reactable(data_unique,
          columns = list(Manufacturer = colDef(details = function(index){
                                               if(data_unique[index]$Manufacturer %in% data_dups){
                                                  reactable(data[Manufacturer == data_unique[index]$Manufacturer,
                                                                                             c("Model", "Type")])
                                                  }})))
  

Пример 2
Теперь у Chrylser больше нет кнопки «Развернуть», и вся ее информация отображается в одной строке. Основная проблема заключается в том, что кнопка «Развернуть» создает отдельную таблицу, которая не совпадает с основной таблицей. Мне нравится поведение, полученное в первом примере с использованием groupBy(), поэтому в идеале у меня была бы комбинация из двух. Спасибо.

Ответ №1:

Как вы сказали, что хотите использовать его shiny , я мог бы подумать об использовании JavaScript для автоматического запуска события щелчка:

 library(shinyjs)

ui <- fluidPage(useShinyjs(), reactable(data, groupBy = "Manufacturer"))

server <- function(input, output, session) {
   session$onFlushed(function() {
      runjs('$(".rt-td>div>span").filter(function(idx, el) {return $(el).text().includes("(1)")}).trigger("click")')
   })
}

shinyApp(ui, server)
  

Ответ №2:

Вы можете просто использовать функцию ‘aggregate’ для достижения этой цели —

пример:

  reactable(data,
                 groupBy = c("Manufacturer"),
                 resizable = TRUE,
                 ......
                 columns = list("Model" = colDef(aggregate = "unique"),
                                "Type" = colDef(aggregate = "unique")))