将函数绑定到环境以访问存储的变量,有哪些缺点?

时间:2017-09-22 09:42:11

标签: r rlang

问题: 我需要一个只接受一个参数的函数,但需要访问其他一些变量。我不想将这些内容存储在.GlobalEnv

当前解决方案: 使用一个获取所有需要参数的函数,创建另一个适应环境的函数。

示例:

library(rlang)
foo <- function(a, b){
  bar <- function(c){
    out <- a + b + c
    out
  }
  set_env(bar, get_env())
  bar
}
bar <- foo(1, 2)
bar(3)

我坚信这种方法有缺点,但我不能指出这些缺点可能是什么。如果你能帮助我,我会很高兴。

1 个答案:

答案 0 :(得分:1)

这没有什么不妥。你也不需要rlang:

foo <- function(a, b)
{
    function(c) a + b + c
}

bar <- foo(1, 2)
bar(3)

foo的返回值将是另一个函数,其环境是定义它的环境。这恰好是foo的环境。

这可能是一个问题的唯一时间是foo中是否有其他对象干扰事情的运作方式。为了防范这种情况,您可以明确创建一个与foo环境不同的新环境:

foo <- function(a, b)
{
    bar <- function(c) a + b + c
    environment(bar) <- new.env(parent=globalenv())
    bar
}

但是,如果有的话,这很少是必要的。