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

如何用R的DT::datatable()实现嵌套列子行点击展开(非Shiny)

用DT::datatable实现嵌套列表列的展开折叠(非Shiny环境)

1. 构造示例嵌套数据

先基于内置的starwars数据集生成嵌套的starwars2,其中NData列是包含每组详细数据的tibble:

library(tidyverse)
library(DT)

# 生成嵌套数据
starwars2 <- starwars %>%
  group_by(species) %>%
  nest(NData = c(name, height, mass, hair_color)) %>%
  ungroup()

2. 实现点击展开/折叠的DT表格

核心思路是利用DT的JavaScript回调,将每个嵌套的tibble转为HTML表格,并通过点击父行控制子表格的显示/隐藏。代码如下:

datatable(
  starwars2,
  escape = FALSE,
  rownames = FALSE,
  options = list(
    rowCallback = JS(
      "function(row, data) {
        // 隐藏原始的NData列内容,替换为展开按钮
        $('td:eq(1)', row).html('<button class=\"toggle-btn\">展开</button>');
        // 创建子表格容器并默认隐藏
        var subTableContainer = $('<div class=\"sub-table\" style=\"display:none; margin-left:20px;\"></div>');
        $('td:eq(1)', row).append(subTableContainer);
        
        // 绑定按钮点击事件,切换显示状态
        $('button.toggle-btn', row).on('click', function() {
          var $btn = $(this);
          var $container = $btn.next('.sub-table');
          
          if ($container.is(':visible')) {
            $container.hide();
            $btn.text('展开');
          } else {
            // 将嵌套tibble解析为HTML表格
            var subData = data[1];
            var columns = Object.keys(subData[0]);
            var html = '<table class=\"table table-striped table-sm\"><thead><tr>';
            // 生成表头
            columns.forEach(col => html += '<th>' + col + '</th>');
            html += '</tr></thead><tbody>';
            // 生成表体行
            subData.forEach(row => {
              html += '<tr>';
              columns.forEach(col => html += '<td>' + (row[col] || '') + '</td>');
              html += '</tr>';
            });
            html += '</tbody></table>';
            
            $container.html(html);
            $container.show();
            $btn.text('折叠');
          }
        });
      }"
    ),
    columnDefs = list(
      list(title = "物种", targets = 0),
      list(title = "详细数据", targets = 1),
      list(width = "20%", targets = 0)
    )
  )
)

3. 导出为标准HTML文档

使用htmlwidgets::saveWidget将生成的DT表格保存为可独立打开的HTML文件:

library(htmlwidgets)

# 先将表格对象赋值给变量
my_nested_table <- datatable(...) # 填入上面的DT完整代码

# 保存为独立HTML
saveWidget(my_nested_table, file = "嵌套表格示例.html", selfcontained = TRUE)

关键说明

  • escape = FALSE:允许在单元格中插入HTML元素(按钮和子表格)
  • rowCallback:每行渲染时执行JS逻辑,负责创建交互组件和绑定事件
  • 子表格通过JS直接解析嵌套数据生成HTML,无需依赖Shiny环境
  • selfcontained = TRUE:生成的HTML包含所有样式和脚本,可直接用浏览器打开

内容的提问来源于stack exchange,提问作者Ahmed El-Gabbas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:33:31