6. 完整的环境操作接下来,把函数环境空间的操作放到一起,做一个完整环境的说明。
图片解释:
- 1. 蓝色圆圈,表示函数封闭,始终指向函数定义环境空间。
- 2. 粉色长方形,表示已加载的包环境空间,包括R_GlobalEnv, base, R_EmptyEnv等
- 3. 绿色长方形,表示已定义的函数环境空间。
- 4. 绿色长方形内的白色长方形,表示命名函数,包括fun1,fun2。
- 5. 不在绿色长方形内白色长方形,表示已定义的匿名函数。
- 6. 在长方形内的粉色小正方形,表示在环境空间中定义的变量,包括x,fx,f2。
- 7. 橙色小正方形,表示在内存中的变量值,包括5,2,1。
- 8. 黑色直线,表示变量的赋值。
- 8. 蓝色直线,表示指向封闭环境空间。
- 9. 橙色直线,表示函数调用过程。
- 10. 程序运行时,产生了函数环境空间的内存地址,包括0x000000000e0db220,0x000000000e0e8cf0, 0x000000000e0db178。
上图中结构,用R代码描述。
# 在当前环境定义变量x> x<-5# 在当前环境定义fun1> fun1<-function(){+ # 打印fun1环境空间+ print("fun1")+ print(environment())++ # 在fun1函数环境中,定义变量x+ x<-1+ function() {+ # 打印匿名环境空间+ print("funX")+ print(environment())+ # 从一级父环境空间中,找到变量x+ x+15+ }+ }# 在当前环境定义fun2> fun2<-function(){+ # 打印fun2环境空间+ print("fun2")+ print(environment())++ # 在fun2函数环境中,定义变量x+ x<-2+ fun1() #调用函数fun1+ }# 在当前环境空间中,调用函数fun2,绑定到f2> f2<-fun2()[1] "fun2"<environment: 0x000000000e0db220>[1] "fun1"<environment: 0x000000000e0e8cf0># 在当前环境空间中,调用匿名函数,并绑定到fx> fx<-f2()[1] "funX"<environment: 0x000000000e0db178># 输出fx的结果> fx[1] 16最后,通过完整的例子,我们清楚了R语言环境空间的基本结构和调用关系。接下来,我们就可以利用环境空间的特性来做一些实际的开发任务了。 |