少用的rapply
函數應該是很多問題的完美解決方案(如this one)。但是,它使用戶編寫的功能f
無法知道它在樹中的位置。在rapply中獲取元素名稱
有沒有什麼辦法可以在rapply
調用中將嵌套列表中元素的名稱傳遞給f
?不幸的是,rapply
很快就撥打.Internal
。
少用的rapply
函數應該是很多問題的完美解決方案(如this one)。但是,它使用戶編寫的功能f
無法知道它在樹中的位置。在rapply中獲取元素名稱
有沒有什麼辦法可以在rapply
調用中將嵌套列表中元素的名稱傳遞給f
?不幸的是,rapply
很快就撥打.Internal
。
最近我用任意深度的嵌套列表掙扎着。最後,在我的案例中,我做出了或多或少可接受的決定。這不是對你的問題的直接回答(沒有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)
參考問題Find the indices of an element in a nested list?,你可以寫:
rappply <- function(x, f) {
setNames(lapply(seq_along(x), function(i) {
if (!is.list(x[[i]])) f(x[[i]], .name = names(x)[i])
else rappply(x[[i]], f)
}), names(x))
}
然後,
> mylist <- list(a = 1, b = list(A = 1, B = 2), c = list(C = 1, D = 3))
>
> rappply(mylist, function(x, ..., .name) {
+ switch(.name, "a" = 1, "C" = 5, x)
+ })
$a
[1] 1
$b
$b$A
[1] 1
$b$B
[1] 2
$c
$c$C
[1] 5
$c$D
[1] 3