R语言中能否将函数的执行环境设置为永久留存?
关于R函数执行环境永久留存的问题解答
你的测试未生效的核心原因
你编写的测试代码没有出现执行环境留存的效果,是因为你仅在函数内部创建并调用了子函数g,没有将该子函数导出到j的执行环境之外的作用域留存。j调用结束后,本次生成的执行环境没有任何外部引用,会被R的垃圾回收机制正常销毁,所以每次调用j都会生成全新的执行环境,变量a每次都会被重置为1。
书中描述的准确含义
Hadley提到的*“当你在一个函数内部创建另一个函数时,子函数的封闭环境就是父函数的执行环境,此时该执行环境不再是临时的”*有一个必要前提:创建的子函数必须被父函数执行环境以外的活跃作用域持有引用。
R的环境回收规则非常明确:只要存在任意指向该环境的活跃引用,环境就不会被销毁,其中存储的所有变量都会永久保留。子函数的封闭环境固定为创建它时的父函数执行环境,只要子函数本身不被销毁,这个父执行环境就会一直被引用,自然不会是临时的。
正确的验证示例
你可以用下面的代码验证该规则:
j <- function() { a <- 1 # 子函数持有当前j执行环境的引用 add_count <- function() { a <<- a + 1 print(a) } # 将子函数作为返回值导出到外部作用域 return(add_count) } # 将返回的子函数存储到全局环境变量中,此时j第一次执行的环境被持续引用,不会被销毁 counter <- j()
运行测试结果如下:
- 第一次调用
counter()返回2 - 第二次调用
counter()返回3 - 后续每次调用都会在上一次的结果上累加,证明
j第一次执行生成的环境及内部的a变量一直留存,没有被销毁。
内容的提问来源于stack exchange,提问作者Stefano Sorgente
相关产品推荐
相关产品推荐

