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)
关键修改说明:
- 引入
shinyjs包并在UI中调用useShinyjs(),用来执行前端JS代码; - Server函数添加
session参数,确保JS代码能正确传递到前端; - 新增
observeEvent监听按钮点击事件,通过runjs执行JS代码:遍历所有分组行(类名为.dtrg-group的表格行),逐个触发点击事件,和手动点击分组行的逻辑一致,实现批量切换展开/折叠状态。
内容的提问来源于stack exchange,提问作者Corentin Wicht
相关产品推荐
相关产品推荐

