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

如何递归提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:33:28