0

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

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

4

1 回答 1

1

这没有什么问题。您也不需要 rlang:

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

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

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

唯一可能出现问题的情况是,是否有其他对象foo会干扰事物的工作方式。为了防止这种情况,您可以显式创建一个与foo's 环境不同的新环境:

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

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

于 2017-09-22T09:49:46.547 回答