如何递归提取shinyTree嵌套列表的层级节点名称向量?
问题描述
使用shinyTree包选中节点后,得到的嵌套列表结构如下:
List of 1 $ :List of 1 ..$ ParentA:List of 1 .. ..$ ParentB:List of 1 .. .. ..$ ParentC: num 0
可通过以下代码复现该结构:
mynode = list(list(ParentA=list(ParentB=list(ParentC=0))))
需要从该嵌套列表中提取出名称向量:c("ParentA", "ParentB", "ParentC")
此前尝试的递归函数未达成目标:
recursive <- function(x){ if(is.list(x)) recursive(x[[1]]) names(x[[1]]) }
解决方案
可以修改递归逻辑,在遍历嵌套列表时逐层收集节点名称,直到遇到非列表元素为止:
extract_node_names <- function(x) { # 若当前子元素仍是列表,先递归处理子元素,再拼接当前层名称 if (is.list(x[[1]])) { c(names(x[[1]]), extract_node_names(x[[1]])) } else { # 遇到非列表元素时,返回当前层的节点名称 names(x[[1]]) } }
测试验证:
extract_node_names(mynode) # 输出结果:[1] "ParentA" "ParentB" "ParentC"
若要兼容空列表等边界情况,可使用更稳健的写法:
extract_node_names <- function(x) { if (!is.list(x) || length(x) == 0) { return(character(0)) } current_name <- names(x[[1]]) if (is.list(x[[1]])) { c(current_name, extract_node_names(x[[1]])) } else { current_name } }
原函数失效的原因是递归调用后直接返回了子元素的结果,未将当前层的名称拼接进去。修改后的函数会按层级顺序收集路径上的所有节点名称,最终得到目标向量。
内容的提问来源于stack exchange,提问作者mazu
相关产品推荐
相关产品推荐

