2012-12-10 7 views
18

Tôi có một danh sách và muốn chia các phần tử của danh sách thành các đối tượng riêng biệt trong môi trường toàn cầu.Trả về các phần tử của danh sách dưới dạng các đối tượng độc lập trong môi trường toàn cầu

Ví dụ, tôi muốn danh sách:

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

được ba đối tượng riêng biệt a, bc.

Tôi cố gắng để đạt được điều này với:

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

Nhưng nó thất bại, với Error in names(x)[1] <<- x[1] : object 'x' not found.

Làm cách nào để đạt được mục tiêu của mình?

Trả lời

24

Có chức năng đặc biệt cho danh sách lập bản đồ môi trường:

> 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 Nhận xét của tôi được cung cấp dưới dạng câu trả lời

+0

Hoàn hảo. Cảm ơn bạn – ricardo

0

tôi không khuyên bạn nên nó nhưng bạn có thể sử dụng 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

Điều này không phải là những gì OP hỏi, nó chỉ gắn đối tượng 'obj' vào đường dẫn tìm kiếm. Điều đó không có nghĩa là bạn gán các phần tử của danh sách cho các đối tượng độc lập trong môi trường toàn cầu. Gregory có câu trả lời đúng. –

+0

@JorisMeys Chắc chắn nhưng họ không bao giờ thực sự nói lý do tại sao họ muốn làm điều này. 'attach' cho phép bạn giả vờ như họ là một phần của môi trường toàn cầu (ít nhất là trong các trường hợp đơn giản) với rất ít công việc. Với điều đó nói rằng tôi chắc chắn nghĩ rằng câu trả lời của Gregory là tốt nhất trong số các câu trả lời nhất định. – Dason

+0

Tôi thấy lý do tại sao bạn đề cập đến nó, nhưng việc sử dụng 'attach' đặt ra nhiều vấn đề hơn là giải quyết, không ít nhất là khi bạn cố gắng thay đổi một trong các thành phần trong danh sách. Như đã nói trong [R Style Guide] (http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html#attach): Khả năng tạo lỗi khi sử dụng đính kèm rất nhiều. Tránh nó đi. –

4

Điều này cũng sẽ làm việc:

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

Bạn có thể muốn 'obj [[i]]' thay vào đó, để bạn gán các vectơ, và không phải là một phần tử liệt kê. – Marius

+0

@Marius, cuộc gọi tốt tôi đã thực hiện chỉnh sửa. –

+0

+1/được chấp nhận. Cảm ơn rất nhiều. Chính xác những gì tôi cần. – ricardo