我在将一个环境插入列表时遇到了一个奇怪的问题。如果列表中已有项目,则使用括号添加环境会出错,但如果使用美元符号表示法则不会。如果列表为空,我在使用括号分配时不会出错,但会导致列表仍然为空。我在这里做错了什么?
> 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 :(得分:3)
问题在于使用单个方括号:
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()
如果您使用单方括号,您不应该忘记在右侧列出该列表。