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

如何在R语言DT包中实现嵌套列表列的子行展开功能

在DT包中实现点击行展开嵌套数据框的子行功能

要实现点击主表行展开对应嵌套数据框的子表功能,可按以下步骤操作:

完整代码实现

library(DT)
library(dplyr)
library(tidyr)

# 数据预处理:分组嵌套并添加展开控制列
iris2 <- iris %>% 
  as_tibble() %>% 
  group_by(Species) %>% 
  nest() %>% 
  mutate(expand = "&oplus;") %>% 
  select(expand, Species, data) # 调整列顺序,将展开控制列放在首位

# 编写JavaScript回调函数,处理子行的展开与折叠
callback <- JS(
  "table.on('click', 'td.details-control', function() {",
  "  var tr = $(this).closest('tr');",
  "  var row = table.row(tr);",
  "  // 切换子行显示状态与图标",
  "  if (row.child.isShown()) {",
  "    row.child.hide();",
  "    tr.find('td:first-child').html('&oplus;');",
  "  } else {",
  "    tr.find('td:first-child').html('&ominus;');",
  "    var data = row.data();",
  "    // 创建子表容器并渲染嵌套数据",
  "    var subTable = $('<table>').appendTo(row.child());",
  "    $(subTable).DataTable({",
  "      data: data[2],",
  "      columns: [",
  "        {title: 'Sepal.Length', data: 'Sepal.Length'},",
  "        {title: 'Sepal.Width', data: 'Sepal.Width'},",
  "        {title: 'Petal.Length', data: 'Petal.Length'},",
  "        {title: 'Petal.Width', data: 'Petal.Width'}",
  "      ],",
  "      // 子表禁用分页、搜索、排序,保持简洁",
  "      paging: false,",
  "      searching: false,",
  "      ordering: false",
  "    });",
  "  }",
  "});"
)

# 渲染最终的DT表格
datatable(
  iris2,
  escape = FALSE, # 允许渲染HTML图标
  callback = callback,
  options = list(
    columnDefs = list(
      list(targets = 0, className = 'details-control', orderable = FALSE)
    ),
    ordering = FALSE # 主表禁用排序
  )
)

关键说明

  1. 数据处理:通过nest()按Species分组嵌套数据,添加expand列作为展开/折叠的控制按钮,调整列顺序确保控制列在最左侧。
  2. 回调函数:监听控制列的点击事件,切换展开图标(⊕/⊖),并在展开时取出对应行的嵌套数据框,将其渲染为子表。子表禁用了分页、搜索和排序功能,避免冗余交互。
  3. 表格渲染:设置escape = FALSE确保HTML格式的图标能正常显示,通过columnDefs将第一列标记为可点击的控制列,禁用排序以保持界面简洁。

内容的提问来源于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.07.10 12:17:41