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

如何修改R语言collapsibletree包的默认展开深度?

在R语言中使用collapsibleTree设置默认展开指定层级的解决方案

我有一组父子层级数据,想用R语言的collapsibleTree包可视化,但找不到设置默认展开深度的方法——比如默认展开3层。目前只知道collapsed=FALSE是全展开,collapsed=TRUE是全折叠,没法指定具体层级。附上示例数据和代码,求解决办法。

示例dput数据

structure(list(ParentNode = c(NA, "President", "President", "CFO", "COO", "Operations SVP", "FP&A SVP", "FP&A VP", "FP&A Senior Analyst"), Node = c("President", "COO", "CFO", "FP&A SVP", "Operations SVP", "Operations VP", "FP&A VP", "FP&A Senior Analyst", "FP&A Associate")), class = "data.frame", row.names = c(NA, -9L))

层级数据表

NodeParentNodeIDParentID
President1
COOPresident21
CFOPresident31
Accounting SVPCFO43
FP&A SVPCFO53
FP&A VPFP&A SVP65
Senior AnalystFP&A VP76
Senior AssociateFP&A VP86
AssociateSenior Associate98
InternAssociate109

示例代码

library(collapsibleTree)
Data1 <- read.csv(".....csv", na.strings ='', stringsAsFactors = FALSE)
Data2 <- Data1[, c(2,1)]
collapsibleTreeNetwork(Data2, collapsed = TRUE, inputId = 'node')

解决方案

collapsibleTree包本身没有直接指定默认展开层级的参数,但可以通过两种实用方法实现需求:

方案1:注入自定义JavaScript代码控制展开层级

利用htmlwidgets的onRender函数,给生成的树图添加JS逻辑,自动展开指定深度的节点:

library(collapsibleTree)
library(htmlwidgets)

# 加载示例数据
Data1 <- structure(list(ParentNode = c(NA, "President", "President", "CFO", "COO", "Operations SVP", "FP&A SVP", "FP&A VP", "FP&A Senior Analyst"), Node = c("President", "COO", "CFO", "FP&A SVP", "Operations SVP", "Operations VP", "FP&A VP", "FP&A Senior Analyst", "FP&A Associate")), class = "data.frame", row.names = c(NA, -9L))
Data2 <- Data1[, c(2,1)]

# 生成基础树图
tree <- collapsibleTreeNetwork(Data2, collapsed = TRUE, inputId = 'node')

# 注入JS代码,默认展开前3层(根节点为第0层)
onRender(
  tree,
  'function(el, x) {
    // 设置最大展开深度(根节点是0,这里设2对应显示前3层)
    const maxDepth = 2;
    
    // 递归遍历并展开节点
    function expandNodes(node, depth) {
      if (depth <= maxDepth && node.children) {
        // 模拟点击折叠按钮展开节点
        d3.select(`#${el.id} [data-id="${node.id}"]`).select(".collapse-button").dispatch("click");
        node.children.forEach(child => expandNodes(child, depth + 1));
      }
    }
    
    // 从根节点开始执行
    expandNodes(x.root, 0);
  }'
)

方案2:预处理数据标记节点展开状态

先计算每个节点的层级,再给数据添加collapsed列,指定哪些节点默认展开:

library(collapsibleTree)
library(dplyr)
library(data.tree)

# 加载示例数据
Data1 <- structure(list(ParentNode = c(NA, "President", "President", "CFO", "COO", "Operations SVP", "FP&A SVP", "FP&A VP", "FP&A Senior Analyst"), Node = c("President", "COO", "CFO", "FP&A SVP", "Operations SVP", "Operations VP", "FP&A VP", "FP&A Senior Analyst", "FP&A Associate")), class = "data.frame", row.names = c(NA, -9L))

# 转换为树形结构计算节点层级(根节点层级设为0)
tree <- as.Node(Data1, pathString = "ParentNode/Node")
tree$Do(function(node) node$level <- node$level - 1)

# 提取节点层级信息并合并到原数据
node_levels <- tree$Get(function(node) list(Node = node$name, level = node$level)) %>%
  bind_rows() %>%
  mutate(Node = as.character(Node))

Data3 <- Data1 %>%
  left_join(node_levels, by = "Node") %>%
  # 层级≤2的节点默认展开,其余折叠
  mutate(collapsed = ifelse(level > 2, TRUE, FALSE)) %>%
  replace_na(list(collapsed = FALSE))

# 生成带自定义展开状态的树图
collapsibleTreeNetwork(Data3, collapsed = "collapsed", inputId = 'node')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:30:32