首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

解密R语言函数的环境空间

解密R语言函数的环境空间

目录
  • R语言的函数环境空间
  • 封闭环境
  • 绑定环境
  • 运行环境
  • 调用环境
  • 完整的环境操作
1. R语言的函数环境空间在R语言中,变量、对象、函数都存在于环境空间中,而函数又可以有自己的环境空间,我们可以在函数内再定义变量、对象和函数,循环往复就形成了我们现在用的R语言环境系统。
一般情况,我们可以通过new.env()去创建一个环境空间,但更多的时候,我们使用的是函数环境空间。
函数环境空间,包括4方面的内容:
  • 封闭环境,每个函数都有一个且只有一个封闭环境空间,指向函数定义的环境空间。
  • 绑定环境,给函数指定一个名字,绑定到函数变量,如fun1<-function(){1}。
  • 运行环境,当函数运行时,在内存中动态产生的环境空间,运行结束后,会自动销毁。
  • 调用环境,是指在哪个环境中进行的方法调用,如fun1<-function(){fun2()},函数fun2在函数fun1被调用。
本文的系统环境
  • Win7 64bit
  • R: 3.0.1 x86_64-w64-mingw32/x64 b4bit
2. 封闭环境封闭环境,比较好理解,是对函数空间的一个静态定义,在函数定义时指向所在的环境空间,通过environment()函数,来查看封闭环境。
我们在当前的环境空间,定义一个函数f1,查看f1函数的封闭环境为 R_GlobalEnv。
> y <- 1> f1 <- function(x) x + y> environment(f1)<environment: R_GlobalEnv>再定义一个函数f2,让f2函数调用f1函数,查看f2的函数的封闭环境为 R_GlobalEnv。
> f2 <- function(x){+   f1()+y+ }> environment(f2)<environment: R_GlobalEnv>所以,封闭环境是在定义的时候设置的,与具体运行时环境,没有关系。
3. 绑定环境绑定环境,就是把函数的定义和调用,通过函数变量连起来。
比如,我们新建一个环境空间e,在e定义一个函数g,就当相于把一个函数绑定到g变量,通过找到e环境空间中的g变量,就可以调用这个函数。
# 新建一个环境空间> e <- new.env()# 绑定一个函数到e$g> e$g <- function() 1# 查看函数g的定义> e$gfunction() 1# 运行函数g> e$g()[1] 1在环境空间e中,再定义一个嵌套函数e$f
# 绑定一个函数到e$f> e$f <- function() {+     function () 1+ }#查看函数f的定义> e$ffunction() {    function () 1}# 调用函数f,返回嵌套的匿名函数定义> e$f()function () 1<environment: 0x000000000dbc0a28># 调用函数f,和嵌套匿名函数,得到结果> e$f()()[1] 1查看函数g和f的封闭环境。
# 函数g和f的封闭环境> environment(e$g)<environment: R_GlobalEnv>> environment(e$f)<environment: R_GlobalEnv># f内部的匿名函数的封闭环境> environment(e$f())<environment: 0x000000000d90b0b0># 匿名函数的父函数的封闭环境> parent.env(environment(e$f()))<environment: R_GlobalEnv>我们看到e$g和e$f的封闭环境,都是当前环境R_GlobalEnv。而e$f()的匿名函数的封闭环境,是当前环境的子环境,也就是e$f函数的环境空间。
返回列表