R递归地获取任意深度的嵌套列表的第一个元素的名称



我知道有很多相关的帖子,但我没有发现任何一个能解决我的问题。情况如下:我使用的是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]])
}

使用lapply,但不起作用。。。我不知道该尝试什么了。。。有人能帮忙吗??

提前感谢

试试这个

strsplit(names(unlist(mynode)) , "\.")[[1]]
  • 输出
#> [1] "ParentA" "ParentB" "ParentC"

递归解决方案是:

recursive <- function(node) {
  x <- NULL
  if (is.list(node)) {
    first <- node[[1]]
    x <- c(x, names(first)[[1]], recursive(first))
  }
  
  return(x)
}
recursive(mynode)
#> [1] "ParentA" "ParentB" "ParentC"

正面?无论名称的格式如何,它都不会失败,尤其是如果它们有"quot;例如CCD_ 2。

mynode <- list(list(ParentA.A=list(ParentB=list(ParentC=0))))

strsplit()在这里不会给你正确的答案:

strsplit(names(unlist(mynode)) , "\.")[[1]]
#> [1] "ParentA" "A"       "ParentB" "ParentC"

但递归解决方案会很好:

recursive(mynode)
#> [1] "ParentA.A" "ParentB"   "ParentC"

这也可以用rrapply-包中的rrapply()来完成,这对于同时处理嵌套列表中的多个节点可能很有用。

rrapply::rrapply(
  mynode, 
  f = function(x, .xparents) .xparents[-1],  
  how = "flatten"                      
)
#> $ParentC
#> [1] "ParentA" "ParentB" "ParentC"

相关内容

最新更新