2012-11-28 6 views
5

Beim Erstellen von verschachtelten Listen hat R, was ich halte, hilfreiche Namensstruktur für die Elemente der Liste. Ich habe eine Liste von Listen und möchte eine Funktion jedes einzelnen Vektors anwenden, der in irgendeiner Liste enthalten ist. lapply tut dies aber dann streift die Benennungsstruktur der Liste. Wie kann ich lapply von jedem Vektorelement der verschachtelten Liste ohne die Namen strippen? Ich habe versucht, den Index zu übergeben, aber das scheint dasselbe zu tun (Strip-Namen).überlappende verschachtelte Liste und behalten Sie die Benennung/Struktur

TEST <- list(n1=list(a="5", b="65"), n2=list(a="f", b= "f6")) 
TEST 
lapply(TEST, function(x) gsub("6", "foo", x)) 
lapply(seq_along(TEST), function(i) gsub("6", "foo", TEST[[i]])) 

Konsolenausgabe:

> TEST 
$n1 
$n1$a 
[1] "5" 

$n1$b 
[1] "65" 


$n2 
$n2$a 
[1] "f" 

$n2$b 
[1] "f6" 


> lapply(TEST, function(x) gsub("6", "foo", x)) 
$n1 
[1] "5" "foo5" 

$n2 
[1] "f" "ffoo" 

Gewünschtes Ergebnis:

$n1 
$n1$a 
[1] "5" 

$n1$b 
[1] "foo5" 


$n2 
$n2$a 
[1] "f" 

$n2$b 
[1] "ffoo" 
+0

@shujaa zu vermeiden, ja bearbeitet ich deinen Kommentar –

Antwort

10

Es Sie die rapply Variante der * Familie

rapply(TEST, function(x){gsub("6", "foo", x)}, how = "list") 

$n1 
$n1$a 
[1] "5" 

$n1$b 
[1] "foo5" 


$n2 
$n2$a 
[1] "f" 

$n2$b 
[1] "ffoo" 

Sie auch tun anwenden möchten scheint könnte es wie dieses Schreiben eine anonyme Funktion

rapply(TEST, gsub, pattern = "6", replacement = "foo", how = "list") 
+0

+1 Schlagen Sie mich es und rettete mir etwas eingeben – Andrie

+1

Ohh neue R Voodoo-Zauber mit Ich habe noch nie gespielt zu reflektieren. Danke, Dason. Ich wusste von "Rapply", aber nicht wie oder warum man es benutzt. Perfekt. –

+0

Irgendein anderer Weg ohne 'rapply'? Es wertet seine Argumente aus, so dass es beim Durchschleifen von Sprachobjekten nicht nützlich ist. – jangorecki

Verwandte Themen