如何在R语言内部函数中修改外部函数变量(不污染全局环境)
问题描述
以下代码运行后会打印数值10:
x <- function(){ number<- 10 y <- function(){ number <- 20 } y() print(number) } x()
请问如何在内部函数y中修改number的值,使其将外部函数x中的number改为20,最终打印出20,且不将该变量赋值到全局环境?
我曾尝试使用assign()函数,但无法确定该设置envir参数为哪个环境才能实现此效果,例如assign("number", 20, envir = "外部函数x的环境")。
解决方案
方法1:使用<<-操作符
<<-会向上查找父级环境并修改目标变量,而非创建局部变量。修改后代码如下:
x <- function(){ number<- 10 y <- function(){ number <<- 20 } y() print(number) } x() # 输出20
该操作符只会在当前函数的父环境(即x的执行环境)中找到number并修改,不会影响全局环境。
方法2:用assign()指定父环境
若不想使用<<-,可通过assign()明确指定要修改的环境:
x <- function(){ number<- 10 y <- function(){ # 获取当前函数y的父环境(即x的环境) assign("number", 20, envir = parent.env(environment())) } y() print(number) } x() # 输出20
environment()返回函数y的当前环境,parent.env()则获取其直接父环境(也就是x的执行环境)。- 也可以用
sys.frame(sys.nframe()-1)替代parent.env(environment()),效果一致。
方法3:主动传递环境参数
定义内部函数y时,将外部函数x的环境作为参数传入:
x <- function(){ number<- 10 y <- function(target_env = environment()){ assign("number", 20, envir = target_env) } y() print(number) } x() # 输出20
这种方式更直观,直接明确要修改的环境对象。
内容的提问来源于stack exchange,提问作者Ben_Roche
相关产品推荐
相关产品推荐

