2012-12-10 20 views
18

Mam listę i chciałbym podzielić elementy listy na oddzielne obiekty w środowisku globalnym.Zwróć elementy listy jako niezależne obiekty w środowisku globalnym

Na przykład, chciałbym listę:

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

być trzy oddzielne obiekty a, b i c.

starałem się osiągnąć z:

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

Ale to nie udało, z Error in names(x)[1] <<- x[1] : object 'x' not found.

Jak mogę osiągnąć mój cel?

Odpowiedz

24

Istnieje specjalna funkcja mapowania na liście do środowiska:

> 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 Jest to mój komentarz podany jako odpowiedź

+0

Idealny. Dziękuję Ci – ricardo

0

Nie polecam go ale można użyć 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

To nie odpowiada OP, tylko dołącza obiekt 'obj' do ścieżki wyszukiwania. To nie znaczy, że przypisujesz elementy listy do niezależnych obiektów w środowisku globalnym. Gregory ma poprawną odpowiedź. –

+0

@JorisMeys Pewnie, ale nigdy tak naprawdę nie powiedzieli, dlaczego chcieli to zrobić. "attach" pozwala ci udawać, że są częścią globalnego środowiska (przynajmniej w prostych przypadkach) z bardzo małą ilością pracy. Powiedziawszy to, zdecydowanie uważam, że odpowiedź Gregory'ego jest najlepsza z podanych odpowiedzi. – Dason

+0

Rozumiem, dlaczego o tym wspomniałeś, ale użycie 'attach' stwarza o wiele więcej problemów niż rozwiązuje, przynajmniej w przypadku próby zmiany jednego z elementów na liście. Jak wspomniano w [R Style Guide] (http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html#attach): Możliwości tworzenia błędów podczas używania attach są liczne. Unikaj tego. –

4

To również będzie działać:

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

Zamiast tego możesz użyć 'obj [[i]]', aby przypisać wektory, a nie jeden element listy. – Marius

+0

@Marius, dobry telefon. Zrobiłem edycję. –

+0

+1/zaakceptowany. Dziękuję bardzo. Dokładnie to, czego potrzebowałem. – ricardo