Board logo

标题: 解密R语言函数的环境空间 [打印本页]

作者: look_w    时间: 2019-2-20 19:14     标题: 解密R语言函数的环境空间

目录
1. R语言的函数环境空间在R语言中,变量、对象、函数都存在于环境空间中,而函数又可以有自己的环境空间,我们可以在函数内再定义变量、对象和函数,循环往复就形成了我们现在用的R语言环境系统。
一般情况,我们可以通过new.env()去创建一个环境空间,但更多的时候,我们使用的是函数环境空间。
函数环境空间,包括4方面的内容:
本文的系统环境
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函数的环境空间。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0