2013-02-01 10 views
8

Die wenig verwendete rapply Funktion sollte eine perfekte Lösung für viele Probleme sein (wie this one). Es bleibt jedoch die vom Benutzer geschriebene Funktion f ohne die Fähigkeit zu wissen, wo sie sich in der Struktur befindet.Get Elementnamen in Rapply

Gibt es eine Möglichkeit, den Namen des Elements in der verschachtelten Liste an f in einem rapply Aufruf übergeben? Leider ruft rapply Anrufe .Internal ziemlich schnell.

Antwort

1

Ich habe kürzlich mit verschachtelten Listen mit beliebiger Tiefe gekämpft. Letztendlich kam ich in meinem Fall zu einer mehr oder weniger akzeptablen Entscheidung. Es ist nicht die direkte Antwort auf Ihre Frage (nein rapply Nutzung), aber es scheint die gleiche Art von Problemen zu lösen. Ich hoffe, es kann helfen.

Anstatt zu versuchen, auf Namen von Listenelementen innerhalb rapply zuzugreifen, generierte ich Vektornamen und fragte nach Elementen.

# 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))) 

Generierung von Namen Vektor ist in meinem Fall ein tricky. Insbesondere sollten Namen von Listenelementen sicher sein, d. H. Ohne das Symbol ..

Der nächste Schritt ist der Zugriff auf das Listenelement über den Stringnamen. Ich habe nichts besseres gefunden, als temporäre Dateien zu verwenden.

f <- function(x){ 
    fname <- tempfile() 
    cat(x, file=fname) 
    source(fname)$value 
} 

Hier f gibt nur Wert von x, wo x eine Zeichenfolge mit vollständigen Namen des Listenelement ist.

Schließlich können wir die Liste in pseudo-rekursive Weise abfragen.

sapply(node.names, f) 
0

auf die Frage Bezug Find the indices of an element in a nested list?, können Sie schreiben:

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)) 
} 

dann,

> 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 
Verwandte Themen