You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shiny中为带rowGroup的datatable添加批量展开/折叠按钮

解决方案

要实现一键展开/折叠所有分组行,我们可以借助shinyjs包执行前端JS代码,触发所有分组行的点击事件(和手动点击分组行的逻辑保持一致)。以下是修改后的完整代码:

library(shiny)
library(DT)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),  # 初始化shinyjs功能
  titlePanel("Collapse/Expand table"),
  mainPanel(
    tabsetPanel(
      tabPanel(
        "table1", 
        actionButton("expandButton", "Expand/Collapse"),
        dataTableOutput("my_table")
      ) 
    )
  )
)

server <- function(input, output, session) {
  output$my_table <- DT::renderDataTable({
    datatable(
      mtcars[1:15, 1:5],
      extensions = c('RowGroup',"Buttons"),
      options = list(
        rowGroup = list(dataSrc = 3), 
        pageLength = 20, 
        dom = 'tB',
        buttons = list(
          list(
            extend = "",
            text = "Collapse rowGroup",
            action = JS("function (e, dt, node, config) {dt.rowGroup().dataSrc('').draw();}")
          )
        )
      ), 
      callback = JS(
        "table.on('click', 'tr.dtrg-group', function () {",
        "  var rowsCollapse = $(this).nextUntil('.dtrg-group');",
        "  $(rowsCollapse).toggleClass('hidden');",
        "});",
        "table.one('init', () => $('#my_table .dtrg-group').trigger('click'))"
      ),
      selection = 'none'
    )
  })
  
  # 监听一键展开/折叠按钮,触发所有分组行的点击事件
  observeEvent(input$expandButton, {
    runjs("$('#my_table .dtrg-group').each(function() {
      $(this).trigger('click');
    });")
  })
}

shinyApp(ui = ui, server = server)

关键修改说明:

  1. 引入shinyjs包并在UI中调用useShinyjs(),用来执行前端JS代码;
  2. Server函数添加session参数,确保JS代码能正确传递到前端;
  3. 新增observeEvent监听按钮点击事件,通过runjs执行JS代码:遍历所有分组行(类名为.dtrg-group的表格行),逐个触发点击事件,和手动点击分组行的逻辑一致,实现批量切换展开/折叠状态。

内容的提问来源于stack exchange,提问作者Corentin Wicht

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:15:42