如何修改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))
层级数据表
| Node | ParentNode | ID | ParentID |
|---|---|---|---|
| President | 1 | ||
| COO | President | 2 | 1 |
| CFO | President | 3 | 1 |
| Accounting SVP | CFO | 4 | 3 |
| FP&A SVP | CFO | 5 | 3 |
| FP&A VP | FP&A SVP | 6 | 5 |
| Senior Analyst | FP&A VP | 7 | 6 |
| Senior Associate | FP&A VP | 8 | 6 |
| Associate | Senior Associate | 9 | 8 |
| Intern | Associate | 10 | 9 |
示例代码
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
相关产品推荐
相关产品推荐

