下面的代码应该更改包含在函数some.var
中的封闭变量set.var
的值。后者将自身称为外部函数g
,其环境更改为set.var
的父环境
new.obj <- function(){
some.var = NULL
set.var <- function(...) {
environment(g) <- parent.frame()
g(x="some.var", ...)
}
get.var <- function(){some.var}
return(list(set.var=set.var, get.var=get.var))
}
g <- function(x) assign(x,1)
但是,obj<-new.obj(); obj$set.var(); obj$get.var()
返回NULL
。这里出了什么问题以及如何解决该行为?
我之所以考虑这种构造,是因为我想在不同的闭包中重用g
中的代码。因此,应将其放置在这些位置之外。
答案 0 :(得分:0)
我怀疑您正在使事情变得不必要的复杂。看一下这个示例,并在需要实现某些无法做到的事情时发表评论:
do_the_job <- function(x) {
return(x * 1000)
}
wrapper_function <- function(y) {
return( do_the_job(y) )
}
my_value <- 5
my_new_value <- wrapper_function(my_value)
答案 1 :(得分:0)
不确定我自己在这里做什么。
我希望它可以帮助/激发您的灵感:
new.obj <- function(){
env1 <- new.env()
env1$some.var = NULL
f <- function() {
environment(g) <- parent.frame()
g(x="some.var", envir = env1)
}
get.var <- function(){ env1$some.var }
return(list(f=f, get.var=get.var))
}
g <- function(x, ...) assign(x, "hihi_changed", envir = ...)
obj<-new.obj(); obj$get.var()
空返回了我们期望的结果。obj$f(); obj$get.var()
函数g最终被调用,它改变了some.var
。我的技巧是将变量some.var
添加到新环境中,并始终引用该env1
环境。
因此在函数g()中,始终使用省略号来引用new.obj环境env1
,当前some.var
所在的环境。
希望这能让您继续前进。