2016-07-07 12 views
0

Wie kann ich auf die Komponentennamen einer Liste innerhalb einer Schleife zugreifen?Zugriff auf den Variablen-/Komponentennamen nach dem Zuweisen einer neuen Variablen

for(v in list(a=1, b=2)){ 
    paste(variable_name(v),"is",v) 
    ## to print a is 1 and b is 2 
} 

Ich kenne die folgenden Code funktioniert, aber ich denke, es sollte ein besserer Weg geben:

l <- list(a=1, b=2) 
for(vName in ls(l)){ 
     paste(vName, "is", l[[vName]]) 
} 

Das gleiche Problem steigt, wenn jede andere Form der Iteration über Elemente wie „anwenden“ Funktionen. Wie kann auf die Komponentennamen zugegriffen werden, ohne die Liste der Namen zu übergeben?

sapply(function(x) paste(x_variable, "is", x), l) 

Gibt es eine Möglichkeit, direkt auf die Namen zuzugreifen? Wenn nicht, was ist die beste Vorgehensweise? Danke.

+0

Ich habe heute eine Antwort akzeptiert. Gestern konnte ich nicht. Vielen Dank. –

+0

@ZheyuanLi, das ist jetzt eigentlich verpönt (Hilfe von der Annahme abhängig machen). Benutzer müssen keine Antworten akzeptieren. –

+2

@AliKhosro Just FYI, aber ich sah und Sie haben noch keine Antworten akzeptiert - Sie müssen auf den großen Haken klicken, um zu akzeptieren. Beachten Sie, dass Sie nichts akzeptieren müssen, aber wie Sie angegeben haben, dass Sie eine Antwort akzeptiert haben, erscheint dies nicht. Ich dachte, ich würde es erwähnen. Sehen Sie die [Tour] (http://stackoverflow.com/tour) zum Beispiel –

Antwort

1

Ich glaube, Sie nur names() wollen:

ll <- list(a=1, b=2) 
for(v in seq_along(ll)){ 
    writeLines(paste(names(ll)[v], "is", ll[v])) 
} 

> ll <- list(a=1, b=2) 
> for(v in seq_along(ll)){ 
+  writeLines(paste(names(ll)[v], "is", ll[v])) 
+ } 
a is 1 
b is 2 

Hinweis jetzt, dass ich eine Schleife über einen Index der Elemente der Liste (die ich als ll außerhalb der Schleife zugeordnet werden), anstatt die Elemente selbst. Sie könnten auch wollen wahrscheinlich nicht names() oft nennen, so dass Sie vor der Schleife skizzieren sollte:

ll <- list(a=1, b=2) 
nams <- names(ll) 
for(v in seq_along(ll)){ 
    writeLines(paste(nams[v], "is", ll[v])) 
} 

Auch nur auf Terminologie, die Dinge, die Sie anrufen Variablen (a, b) aren‘ t wirklich Variablen sensu andere Programmiersprachen. In R, a und b sind die Komponenten einer Liste. Ich war ein wenig verwirrt darüber, was du ursprünglich wolltest.

Es ist ein kleiner Trick, dies mit sapply() zu tun, aber die gleiche Idee funktioniert: iterieren über die Indizes von Objekten Elemente/Komponenten nicht die Elemente/Komponenten selbst.

sapply(seq_along(ll), 
     function(i, list, names) paste(names[i], "is", list[i]), 
     list = ll, names = nams) 

> sapply(seq_along(ll), 
+  function(i, list, names) paste(names[i], "is", list[i]), 
+  list = ll, names = nams) 
[1] "a is 1" "b is 2" 
+0

Danke für die Antwort. Ich habe zwei neue Fragen: 1) Was ist, wenn wir Umgebung statt Liste haben. Die Umgebung ist keine Teilmenge. 2) Was ist der Vorteil Ihrer Lösung zu sapply (Namen (ll), Funktion (x, Liste) einfügen (x, "ist", Liste [x]), list = ll)? Ist Ihre Lösung schneller oder effizienter? Danke. –

Verwandte Themen