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

reactable使用groupBy与自定义JS聚合函数实现三级层级分组表格问询

解决方案

使用reactable原生的groupBy功能配合自定义列聚合规则,即可同时满足折叠展开需求与全局列对齐效果:

步骤1:预处理数据

先给每一条三级编码记录补全所属的一级、二级编码与对应名称:

library(dplyr)
library(readxl)
library(reactable)

# 读取原始数据
ocup  <- readxl::read_excel("cno11_estructura.xls",
                           col_names = F,
                           sheet     = 1,
                           range     = "A1:B761")
colnames(ocup) <- c("codigo_ocup", "nombre_ocup")

# 分离各级分组数据
grp1 <- filter(ocup, nchar(codigo_ocup) == 1) %>% 
  select(cod1 = codigo_ocup, nombre1 = nombre_ocup)
grp2 <- filter(ocup, nchar(codigo_ocup) == 2) %>% 
  select(cod2 = codigo_ocup, nombre2 = nombre_ocup)
grp3 <- filter(ocup, nchar(codigo_ocup) == 3) 

# 给三级数据补全上级信息
grp3 <- grp3 %>%
  mutate(
    cod1 = substr(codigo_ocup, 1, 1),
    cod2 = substr(codigo_ocup, 1, 2)
  ) %>%
  left_join(grp1, by = "cod1") %>%
  left_join(grp2, by = "cod2")

步骤2:配置reactable分组展示

指定分组字段,给各列设置自定义聚合函数,不同层级展示对应分组的编码和名称:

reactable(
  grp3,
  groupBy = c("cod1", "cod2"),
  columns = list(
    cod1 = colDef(
      name = "编码",
      aggregate = JS("values => values[0]")
    ),
    cod2 = colDef(
      name = "编码",
      aggregate = JS("values => values[0]"),
      hidden = TRUE
    ),
    codigo_ocup = colDef(name = "编码"),
    nombre_ocup = colDef(
      name = "名称",
      aggregate = JS("
        (_, rowInfo) => {
          if (rowInfo.groupBy === 'cod1') return rowInfo.rows[0].nombre1
          if (rowInfo.groupBy === 'cod2') return rowInfo.rows[0].nombre2
        }
      ")
    ),
    nombre1 = colDef(hidden = TRUE),
    nombre2 = colDef(hidden = TRUE)
  )
)

效果说明

  • 初始状态仅展示1位编码的一级分组,点击展开后显示2位编码的二级分组,再次展开显示3位编码的三级明细
  • 所有层级的编码、名称列全局对齐,没有嵌套表格的错位问题
  • 不需要额外处理数据聚合,直接利用已有的分组名称信息展示即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:45:03