创建并链接环境
我们使用 new.env( ) 函数创建一个新环境:
e1 <- new.env()
环境通常用十六进制数表示,即内存地址:
e1
## <environment: 0x0000000014a45748>
我们可以用提取操作符($ 和 [[)在环境中创建变量,其代码形式类似于修改一个列表:
e1$x <- 1
e1[["x"]]
## [1] 1
但是,环境和列表有以下三大主要区别:
• 环境没有索引;
• 环境有父环境;
• 环境具有引用语义。
接下来,我们将给出详细解释。
访问环境
环境没有索引。这说明我们既不能对环境构建子集,也不能通过索引从环境中提取元
素。如果我们尝试用位置对环境构建子集,将会得到错误信息:
e1[1:3]
## Error in e1[1:3]: 类别为'environment'的对象不可以取子集
当我们尝试从环境中利用索引提取变量时,会得到另一种报错:
e1[[1]]
## Error in e1[[1]]: 取子集环境时的参数不对
正确的操作方式是直接输入对象名称和环境访问函数。例如,可以用 exists( ) 函
数查看环境中是否存在某个变量:
exists("x", e1)
## [1] TRUE
对于一个存在的变量,可以调用 get( ) 函数获取它的值:
get("x", e1)
## [1] 1
也可以调用 ls( ) 函数查看给定环境中的所有变量,正如在第 3 章中提到的:
ls(e1)
## [1] "x"
如果使用 $ 或 [[ 访问环境中不存在的变量,就像我们试图用列表中不存在的名字提
取元素一样,结果返回 NULL:
e1$y
## NULL
e1[["y"]]
## NULL
但是,如果将 get( ) 函数作用在环境中不存在的变量上,我们就一定会得到错误信
息,就像不小心引用了一个不存在的变量一样:
get("y", e1)
## Error in get("y", e1): 找不到对象'y'
为了减少错误,更好地处理这种情况,在使用 get( ) 函数之前,先用 exists( ) 函
数检测变量是否存在:
exists("y", e1)
## [1] FALSE