2012-12-10 12 views
18

Ich habe eine Liste und möchte die Elemente der Liste in separate Objekte in der globalen Umgebung aufteilen.Rückgabeelemente der Liste als unabhängige Objekte in globaler Umgebung

Zum Beispiel würde ich die Liste mag:

obj <- list(a=1:5, b=2:10, c=-5:5) 

werden drei separate Objekte a, b und c.

Ich habe versucht, dies zu erreichen mit:

lapply(obj, FUN = function(x) names(x)[1] <<- x[1]) 

Aber es scheiterte, mit Error in names(x)[1] <<- x[1] : object 'x' not found.

Wie kann ich mein Ziel erreichen?

Antwort

24

Es besondere Funktion Umgebung für Mapping-Liste ist:

> obj <- list(a=1:5, b=2:10, c=-5:5) 
> ls() 
[1] "obj" 
> list2env(obj,globalenv()) 
<environment: R_GlobalEnv> 
> ls() 
[1] "a" "b" "c" "obj" 

PS Es ist mein Kommentar als Antwort

zur Verfügung gestellt
+0

Perfekt. Vielen Dank – ricardo

0

Ich empfehle es nicht, aber Sie attach

> obj <- list(a=1:5, b=2:10, c=-5:5) 
> attach(obj) 
> a 
[1] 1 2 3 4 5 
> b 
[1] 2 3 4 5 6 7 8 9 10 
> c 
[1] -5 -4 -3 -2 -1 0 1 2 3 4 5 
+1

Das fragt OP nicht, es fügt nur das Objekt 'obj' an den Suchpfad an. Das bedeutet nicht, dass Sie die Elemente der Liste unabhängigen Objekten in der globalen Umgebung zuweisen. Gregory hat die richtige Antwort. –

+0

@JorisMeys Sicher, aber sie haben nie wirklich gesagt, warum sie das auch tun wollten. Mit 'attach' können Sie so tun, als wären sie (zumindest in einfachen Fällen) ein Teil der globalen Umgebung mit sehr wenig Arbeit. Mit diesem sagte ich definitiv Gregors Antwort ist das Beste aus den Antworten gegeben. – Dason

+0

Ich sehe, warum Sie es erwähnt haben, aber die Verwendung von "attach" wirft viel mehr Probleme auf, als es löst, nicht im geringsten, wenn Sie versuchen, eines der Elemente in der Liste zu ändern. Wie in der [R Style Guide] (http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html#attachment) gesagt: Die Möglichkeiten zum Erstellen von Fehlern bei der Verwendung von Attach sind zahlreich. Vermeide es. –

4

Dies auch funktionieren würde verwenden:

lapply(seq_along(obj), function(i) assign(names(obj)[i], obj[[i]], envir = .GlobalEnv)) 
+0

Sie könnten stattdessen 'obj [[i]]' wollen, damit Sie Vektoren zuweisen, und nicht eine Elementliste. – Marius

+0

@Marius, guten Ruf habe ich den Schnitt gemacht. –

+0

+1/akzeptiert. Vielen Dank. Genau das, was ich brauchte. – ricardo

Verwandte Themen