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