我最近与任意深度的嵌套列表作斗争。最终,在我的情况下,我做出了或多或少可以接受的决定。这不是您问题的直接答案(没有rapply
用法),但它似乎正在解决同类问题。我希望它可以有所帮助。
我没有尝试访问内部列表元素rapply
的名称,而是生成了名称向量并在其中查询元素。
# Sample list with depth of 3
mylist <- list(a=-1, b=list(A=1,B=2), c=list(C=3,D=4, E=list(F=5,G=6)))
在我的情况下,生成名称向量是一个棘手的问题。具体来说,列表元素的名称应该是安全的,即没有.
符号。
list.names <- strsplit(names(unlist(mylist)), split=".", fixed=TRUE)
node.names <- sapply(list.names, function(x) paste(x, collapse="$"))
node.names <- paste("mylist", node.names, sep="$")
node.names
[1] "mylist$a" "mylist$b$A" "mylist$b$B" "mylist$c$C" "mylist$c$D" "mylist$c$E$F"
[7] "mylist$c$E$G"
下一步是按字符串名称访问列表元素。我发现没有什么比使用临时文件更好的了。
f <- function(x){
fname <- tempfile()
cat(x, file=fname)
source(fname)$value
}
这里f
只返回 的值x
,其中x
是具有列表元素全名的字符串。
最后,我们可以以伪递归的方式查询列表。
sapply(node.names, f)