2014-08-28 78 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