#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")
В приведенной выше таблице показана только одна запись в 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")])
}})))
Теперь у 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")))