2012-12-10 19 views
18

我有一個列表,並希望將列表中的元素分解爲全局環境中的單獨對象。將列表中的元素作爲全局環境中的獨立對象返回

例如,我想名單:

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

是三個單獨對象abc

我試圖實現這一目標:

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

但它失敗了,與Error in names(x)[1] <<- x[1] : object 'x' not found

我該如何實現自己的目標?

回答

24

有映射表的特殊功能,以環境:

> 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這是我作爲答覆提供的評論

+0

完美。謝謝 – ricardo

0

我不建議這樣做,但你可以使用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

這不是OP所要求的,它只是將對象'obj'附加到搜索路徑。這並不意味着您將列表的元素分配給全局環境中的獨立對象。格雷戈裏有正確的答案。 –

+0

@JorisMeys當然,但他們從來沒有真正說過他們爲什麼要這麼做。 'attach'允許你假裝他們是全球環境的一部分(至少在簡單的情況下),只需很少的工作。這樣說我絕對認爲格雷戈裏的答案是最好的答案。 – Dason

+0

我明白了爲什麼你提到它,但是使用'attach'會帶來更多的問題,而不是最終解決的問題,當你嘗試更改列表中的某個元素時。正如[R風格指南](http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html#attach)中所述:使用attach時創建錯誤的可能性很多。躲開它。 –

4

這也將工作:

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

您可能需要'obj [[i]]',以便分配向量,而不是一個元素列表。 – Marius

+0

@Marius,我做了編輯。 –

+0

+1 /接受。非常感謝。正是我需要的。 – ricardo

相關問題