【R语言】环境空间

一、环境空间的特点

环境空间是一种特殊类型的变量,它可以像其它变量一样被分配和操作,还可以以参数的形式传递给函数。

R语言中环境空间具有如下3个特点:

1、对象名称唯一性

此特点指的是在不同的环境空间中可以有同名的变量出现,但是在同一个环境空间内不允许有同名的变量出现,即使对同一个变量进行多次赋值操作,其每次赋值的内存地址也都不相同。

R 复制代码
# 定义变量x并查看其内存地址
x <- "你好,关关。"
data.table::address(x)
# 对x重新赋值然后查看其内存地址
x <- c(22,33,44,55)
data.table::address(x)

2、变量赋值传递性

如果把当前环境空间变量赋值给一个新变量,修改原有环境空间变量的值,则新环境空间中的变量值也会跟着改变。

R 复制代码
# 创建环境空间变量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包的环境空间,最后是自定义的环境空间。可以通过递归查找父环境空间来查看整个环境空间的层次结构。

R 复制代码
# 删除当前环境空间里的所有对象
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、全局环境

R 复制代码
# 全局环境(当前环境)
environment()

2、内部环境

R 复制代码
e <- new.env()
e

3、父环境

R 复制代码
# 查看环境e的父环境
parent.env(e)

4、空环境

R 复制代码
emptyenv()

5、包环境

R 复制代码
baseenv()

三、环境空间的使用方法

R语言的base包有一些基础的函数,可以用来使用环境空间。

environment:查看函数的环境空间定义;

environmentName:查看环境空间的名字;

env.profile:查看环境空间的属性值;

new.env:创建一个新的环境空间;

is.environment:判断一个对象是否属于环境空间;

ls:列出当前环境空间中的所有对象;

search:查看当前环境空间中加载的R包;

exists:查看指定环境空间中的对象是否存在;

get:取出指定环境空间中的对象;

assign:给环境空间中的变量赋值;

rm:删除环境空间中的对象。

1、环境空间的访问

查看函数所在的环境空间

R 复制代码
# 查看mean函数所在的环境空间
environment(mean)

新建环境空间

R 复制代码
# 新建环境空间
e <- new.env(hash=T, parent = parent.frame(), size=29L)

判断是否是环境空间

R 复制代码
# 判断是否是环境空间
is.environment(e)

查看环境空间的属性

R 复制代码
# 查看环境空间的属性
env.profile(e)

设置环境空间的名字及查看其名字

R 复制代码
# 设置环境空间的名字及查看其名字
attr(e, "name") <- "Ning"
environmentName(e)

2、环境空间的对象操作

清除当期环境空间中定义的所有对象,并创建新对象

R 复制代码
# 清除当前环境空间中定义的所有对象,并创建新对象
rm(list = ls())
e1 <- new.env(hash=T, parent = parent.frame(), size = 29L)
e1

给环境空间添加变量

R 复制代码
# 给环境空间添加变量
e1$x <- c(2,3,5,7)
e1$y <- function(){
    "你好,关关。"
}
assign(x = "a", value = "你好,关关。", envir = e1)

查看当前环境空间和e1空间中的变量

R 复制代码
ls(e1)

查看环境空间中某个变量是否存在

R 复制代码
# 查看e1环境变量中x变量是否存在
exists("x", envir=e1)

取出环境空间中的变量值

R 复制代码
get("x", envir=e1)

给环境空间中的变量重新赋值

R 复制代码
assign(x = "x", value = c(1,2,3,4,6,7), envir = e1)
get("x", envir=e1)

删除环境空间中的变量

R 复制代码
rm(x, envir=e1)
ls(e1)
相关推荐
IT猿手1 分钟前
2025最新群智能优化算法:云漂移优化(Cloud Drift Optimization,CDO)算法求解23个经典函数测试集,MATLAB
开发语言·数据库·算法·数学建模·matlab·机器人
至暗时刻darkest6 分钟前
go mod文件 项目版本管理
开发语言·后端·golang
sakoba31 分钟前
spring IOC(实现原理)
java·开发语言
MZWeiei32 分钟前
Scala:在哪里写类的属性?类的属性必须私有吗?类的必须初始化吗?
开发语言·scala
闯闯桑33 分钟前
Scala 中的访问修饰符
大数据·开发语言·scala
我不是代码教父33 分钟前
[原创](Modern C++)现代C++的关键性概念: 非常独特的std::sentinel_for概念(哨兵概念)
开发语言·c++·sentinel
不爱学习的小枫38 分钟前
scala函数的至简原则
开发语言·scala
YGGP1 小时前
【每日八股】Golang篇(二):关键字(上)
开发语言·后端·golang
꧁坚持很酷꧂1 小时前
QT登录系统界面
开发语言·qt
ErizJ1 小时前
Golang | Gin(简洁版)
开发语言·golang·gin