1

我正在尝试使用 Shiny 中的 reactable 生成一个交互式表,它只为在单个键变量下包含多个值的行创建可扩展组。

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() 产生的行为,所以理想情况下我会结合使用这两者。谢谢。

4

2 回答 2

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)
于 2020-10-09T11:02:50.133 回答
0

您可以简单地使用“聚合”功能来实现这一点 -

例子:

 reactable(data,
                 groupBy = c("Manufacturer"),
                 resizable = TRUE,
                 ......
                 columns = list("Model" = colDef(aggregate = "unique"),
                                "Type" = colDef(aggregate = "unique")))
于 2021-10-06T21:46:44.810 回答