使用data.tree构建树时子节点错误关联至非预期父节点的问题排查
问题原因及解决方法
问题出在treeToList函数的Map调用顺序错误。R语言中Map函数的语法是Map(函数, 迭代对象),你当前把node$children(迭代对象)放在了第一个参数位置,把要执行的treeToList函数放在了f参数里,完全颠倒了调用逻辑,导致子节点生成逻辑混乱,最终出现节点关联错误。
修正后的代码
只需要调整children部分的调用逻辑,改用更直观的lapply,或者修正Map的参数顺序即可:
library(data.tree) data <- data.frame( Name = c("A", "A1", "A2", "A1a", "A1b", "A2a", "A2b", "A2c","B"), Path = c("1", "1,a", "1,b", "1,a,1", "1,a,2", "1,b,1", "1,b,2", "1,b,3","2") ) my_tree <- data %>% rowwise() %>% mutate(pathString = strsplit(Path, ',') %>% unlist() %>% paste(collapse = '/')) %>% as.Node() treeToList <- function(node) { list( text = node$Name, li_attr = list(id = node$Path), state = list(opened = TRUE), # 改用lapply更直观 children = lapply(node$children, treeToList) # 也可以写成修正后的Map调用:children = Map(f = treeToList, node$children) ) } treeToList(my_tree)
修正后的结果
此时生成的树结构会符合预期:
- 节点
1(Name="A")的子节点是1,a(Name="A1")和1,b(Name="A2") - 节点
2(Name="B")是独立的根节点,不会错误关联其他子节点
内容的提问来源于stack exchange,提问作者Kamaloka
相关产品推荐
相关产品推荐

