Niedawno zmagałem się z zagnieżdżonymi listami z dowolną głębią. W końcu doszłam do mniej lub bardziej akceptowalnej decyzji w moim przypadku. Nie jest to bezpośrednia odpowiedź na twoje pytanie (no rapply
), ale wydaje się, że rozwiązuje ten sam rodzaj problemów. Mam nadzieję, że może to być pomocne.
Zamiast próbować uzyskać dostęp do nazw elementów listy wewnątrz rapply
wygenerowałem wektor nazw i zapytałem o elementy.
# 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)))
Generowanie wektorów nazw jest w moim przypadku trudne. W szczególności nazwy elementów listy powinny być bezpieczne, tj. Bez symbolu .
.
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"
Następnym krokiem jest uzyskanie dostępu do elementu listy według nazwy ciągu. Nie znalazłem nic lepszego niż użycie pliku tymczasowego.
f <- function(x){
fname <- tempfile()
cat(x, file=fname)
source(fname)$value
}
Tutaj f
prostu zwraca wartość x
, gdzie x
jest ciągiem z pełną nazwą elementu listy.
Wreszcie możemy wyświetlić listę zapytań w pseudorekursywny sposób.
sapply(node.names, f)