【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)
相关推荐
焱齿19 分钟前
golang开发技能
开发语言·后端·golang
画个逗号给明天"37 分钟前
C++11新特性之long long超长整形
开发语言·c++
无限大.1 小时前
一表总结 Java 的3种设计模式与6大设计原则
java·开发语言·设计模式
重生之我在20年代敲代码2 小时前
【C++】STL——vector的使用
开发语言·c++
孔瑾熙2 小时前
Swift语言的文件操作
开发语言·后端·golang
小姚也要变强2 小时前
sort排序 计数排序 map set C++ 蓝桥杯
开发语言·c++·算法·蓝桥杯
美味小鱼3 小时前
Rust 的基本类型有哪些,他们存在堆上还是栈上,是否可以COPY?
开发语言·后端·rust
AI量化投资实验室3 小时前
celery策略回测任务运行及金融量化数据增量更新|年化18.8%,回撤8%的组合策略(python代码)
开发语言·python·金融
Dr.勿忘3 小时前
C#面试常考随笔12:游戏开发中常用的设计模式【C#面试题(中级篇)补充】
开发语言·unity·设计模式·面试·c#·游戏引擎
孔瑾熙3 小时前
Elixir语言的网络编程
开发语言·后端·golang