2014-08-28 73 views
1

我有一個奇怪的問題插入一個列表中的環境。如果列表中已有項目,則使用方括號添加環境時會出錯,但如果使用美元符號記號,則不會。如果列表爲空,則在使用括號進行分配時不會出現錯誤,但會導致列表仍然爲空。我在這裏做錯了什麼?問題分配環境到列表R

> x <- list() 
> x['a'] <- 3  
> x['b'] <- baseenv() 
Error in x["b"] <- baseenv() : 
    environments cannot be coerced to other types 
> x$b <- baseenv() 
> x 
$a 
[1] 3 

$b 
<environment: base> 
> y <- list() 
> y['env'] <- baseenv() 
> y 
list() 

R和平臺信息:

R version 2.15.2 (2012-10-26) 
Platform: x86_64-redhat-linux-gnu (64-bit) 
+0

'X $ B'等同於'X [[ 'B']'而不是'X [ 'B']' – jdharrison 2014-08-28 16:11:46

回答

2

問題在於,在使用單方括號:

x['b'] <- baseenv() 

實際上是一個列表替代。您選擇一個元素列表(在這種情況下,列表只包含一個元素b),您應該用另一個列表替換它。但是,你給那裏的環境。在您使用的替換中,您還需要在右側提供一個列表。如果沒有,R會嘗試將右側的對象轉換爲列表。這會產生你看到的錯誤。

下面的例子看看:

> x <- list(
+ a= 1:10, 
+ b= "hello" 
+) 

> x['b'] 
$b 
[1] "hello" 


> x[['b']] 
[1] "hello" 

注意x['b']返回列表,而x[['b']]返回元素本身的選擇。 x$b也是如此,這相當於使用雙括號。

所以,你有三種選擇這裏包括在該列表中的環境:如果您使用單括號

x['b'] <- list(baseenv()) 
x[['b']] <- baseenv() 
x$b <- baseenv() 

,你不應該忘記對右邊這個列表。

+0

Gaaahhhhh,我需要更多的咖啡。感謝您的支持。 – andrew 2014-08-28 17:26:54