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

Binding functions to environment to access stored variables, what are the downsides?

问题: 我需要一个只接受一个参数但需要访问其他一些变量的函数。我不想将这些存储在 .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)

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

这没有错。你也不需要 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
}

但这应该很少(如果有的话)是必要的。