通过闭包内调用的外部函数访问封闭变量

时间:2018-09-26 12:55:03

标签: r closures

下面的代码应该更改包含在函数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中的代码。因此,应将其放置在这些位置之外。

2 个答案:

答案 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 = ...)
  1. obj<-new.obj(); obj$get.var()空返回了我们期望的结果。
  2. obj$f(); obj$get.var()函数g最终被调用,它改变了some.var

我的技巧是将变量some.var添加到新环境中,并始终引用该env1环境。

因此在函数g()中,始终使用省略号来引用new.obj环境env1,当前some.var所在的环境。

希望这能让您继续前进。