前言
环境空间(environment)对于大部分的R使用者来说,都是比较陌生的。虽然我们不了解它的运行原理,但也不影响我们使用R语言。环境空间是R语言中关于计算机方面的底层设计,主要用于R语言是环境加载器。通过环境空间,封装了加载器的运行过程,让使用者在不知道底层细节的情况下,可以任意加载使用到的第三方的R语言程序包。
本文将揭开R语言中环境空间的神秘面纱。
目录
1 R语言的环境空间在R语言中,不管是变量,对象,或者函数,都存在于R的环境空间中,R程序在运行时都自己的运行时空间。R语言的环境(environment)是由内核定义的一个数据结构,由一系列的、有层次关系的框架(frame)组成,每个环境对应一个框架,用来区别不同的运行时空间(scope)。
环境空间有一些特征,比如 每个环境空间要有唯一的名字;环境空间是引入类型的,非赋值类型;环境空间都有父环境空间,空环境是最顶层的环境空间,没有父空间;子环境空间会继承父环境空间的变量等。
本文的系统环境
- Linux: Ubuntu Server 12.04.2 LTS 64bit
- R: 3.0.1 x86_64-pc-linux-gnu
为了方便我们检查对象的类型,引入pryr包作为辅助工具。关于pryr包的介绍,请参考文章:
# 加载pryr包> library(pryr)1.1 创建一个环境
查看new.env()函数的定义。
new.env(hash = TRUE, parent = parent.frame(), size = 29L)参数列表:
- hash 默认值是TRUE,使用Hash table的结构。
- parent 指定要创建环境的父环境。
- size 初始化的环境空间大小。
运行函数new.env(),创建一个新环境。
# 创建环境e1> e1 <- new.env()# 输出e1> e1<environment: 0x3d7eef0># 查看e1类型> class(e1)[1] "environment"# otype查看e1类型,属于基本类型> otype(e1)[1] "primitive"接下来,我们在e1环境中定义一个变量。
# 定义变量a> e1$a <- 10# 输出变量a> e1$a[1] 10# 列出当前环境中的变量> ls()[1] "e1"# 列出e1环境中的变量> ls(e1)[1] "a"这时,我们看到了两个环境空间,当前环境空间和e1环境空间。e1做为一个变量在当前的环境中被定义,而变量a是在e1环境中被定义。 |