【R语言】环境空间
一、环境空间的特点
环境空间是一种特殊类型的变量,它可以像其它变量一样被分配和操作,还可以以参数的形式传递给函数。
R语言中环境空间具有如下3个特点:
1、对象名称唯一性
此特点指的是在不同的环境空间中可以有同名的变量出现,但是在同一个环境空间内不允许有同名的变量出现,即使对同一个变量进行多次赋值操作,其每次赋值的内存地址也都不相同。
# 定义变量x并查看其内存地址
x <- "你好,关关。"
data.table::address(x)
# 对x重新赋值然后查看其内存地址
x <- c(22,33,44,55)
data.table::address(x)
2、变量赋值传递性
如果把当前环境空间变量赋值给一个新变量,修改原有环境空间变量的值,则新环境空间中的变量值也会跟着改变。
# 创建环境空间变量e1
e1 <- new.env()
# 将环境空间变量e1赋值给e2
e2 <- e1
# 给e1环境空间中的变量赋值
e1$x <- c(1,2,3)
# 查看e2中的变量x
e2$x
# 比较e1和e2是否相同
identical(e1, e2)
# 查看e1和e2的环境地址是否相同
data.table::address(e1)
data.table::address(e2)
3、结构层次性
在R语言的环境变量中,空环境是最顶层的环境空间,其次是base包的环境空间,最后是自定义的环境空间。可以通过递归查找父环境空间来查看整个环境空间的层次结构。
# 删除当前环境空间里的所有对象
rm(list = ls())
# 创建新的环境空间对象e1
e1 <- new.env()
# 编写递归查找父空间的函数
parent.find <- function(e) {
print(e)
if (is.environment(e) & !identical(emptyenv(), e)) {
parent.find(parent.env(e))
}
}
# 递归查找环境空间e1的父空间
parent.find(e1)
从以上结果可知:内部环境e1的父环境是全局环境,接着是base包环境,和通过Autoloads函数加载的6个基础包环境(stats,graphics,grDevices,utils,datasets,methods),最顶层的是空环境。
二、环境空间种类
R语言中有5种环境:
全局环境:也叫用户环境,指在当前用户下R程序运行的环境空间。
内部环境:通过“new.env()”命令创建的环境空间,也可以是匿名的环境空间。
父环境:当前环境空间所处的上一层环境。
空环境:也叫顶层环境,指没有父环境的环境空间。
包环境:指R包封装的环境空间。
1、全局环境
# 全局环境(当前环境)
environment()
2、内部环境
e <- new.env()
e
3、父环境
# 查看环境e的父环境
parent.env(e)
4、空环境
emptyenv()
5、包环境
baseenv()
三、环境空间的使用方法
R语言的base包有一些基础的函数,可以用来使用环境空间。
environment:查看函数的环境空间定义;
environmentName:查看环境空间的名字;
env.profile:查看环境空间的属性值;
new.env:创建一个新的环境空间;
is.environment:判断一个对象是否属于环境空间;
ls:列出当前环境空间中的所有对象;
search:查看当前环境空间中加载的R包;
exists:查看指定环境空间中的对象是否存在;
get:取出指定环境空间中的对象;
assign:给环境空间中的变量赋值;
rm:删除环境空间中的对象。
1、环境空间的访问
查看函数所在的环境空间
# 查看mean函数所在的环境空间
environment(mean)
新建环境空间
# 新建环境空间
e <- new.env(hash=T, parent = parent.frame(), size=29L)
判断是否是环境空间
# 判断是否是环境空间
is.environment(e)
查看环境空间的属性
# 查看环境空间的属性
env.profile(e)
设置环境空间的名字及查看其名字
# 设置环境空间的名字及查看其名字
attr(e, "name") <- "Ning"
environmentName(e)
2、环境空间的对象操作
清除当期环境空间中定义的所有对象,并创建新对象
# 清除当前环境空间中定义的所有对象,并创建新对象
rm(list = ls())
e1 <- new.env(hash=T, parent = parent.frame(), size = 29L)
e1
给环境空间添加变量
# 给环境空间添加变量
e1$x <- c(2,3,5,7)
e1$y <- function(){
"你好,关关。"
}
assign(x = "a", value = "你好,关关。", envir = e1)
查看当前环境空间和e1空间中的变量
ls(e1)
查看环境空间中某个变量是否存在
# 查看e1环境变量中x变量是否存在
exists("x", envir=e1)
取出环境空间中的变量值
get("x", envir=e1)
给环境空间中的变量重新赋值
assign(x = "x", value = c(1,2,3,4,6,7), envir = e1)
get("x", envir=e1)
删除环境空间中的变量
rm(x, envir=e1)
ls(e1)