使用全局变量作为 R 函数的输入

Using global variables as input to R function

有很多关于使用 <<-assign() 从 R 函数内部更新全局变量的例子(here 只是一个例子),但我不能查找有关如何使用此类变量作为函数输入的任何示例。例如,考虑这个 MATLAB 函数,它只是将 pi 添加到数字的一种复杂方法:

function final = parentFun(why)
    global pie
    pie = pi;
    final = childFun(why);
end

function y = childFun(x)
    global pie
    y = x + pie;
end

这样

>> parentFun(100)

ans =

  103.1416

我想在 R 中重新创建它。我得到的最接近的是像这样将 childFun 嵌套到 parentFun 中:

parentFun <- function(why) {
    pie <- pi
    childFun <- function(x) {
        x + pie
    }
    childFun(why)
}

确实如此

> parentFun(100)
[1] 103.1416

问题是,在我的真实情况下,parentFun 有几百行长,其中包含几个可能一样长的子项。换句话说,嵌套基本上是关闭table.

此外,这些是包中的函数,因此 pie 实际上是从函数中获取的,而不是由脚本启动的。

当然,将两个函数分开是行不通的,因为childFun()看不到pie:

> parentFun <- function(why) {
        pie <- pi
        childFun(why)
}
> childFun <- function(x) {
        x + pie
}
> parentFun(100)
Error in x + pie : non-numeric argument to binary operator

一种可能是改变 childfun

的环境
childFun <- function(x) {
        x + pie
}

parentFun <- function(why) {
        pie <- pi
        environment(childFun) <- environment()
        childFun(why)
}

parentFun(100)
[1] 103.1416

这与 R 的词法作用域有关。当您调用函数时,R 首先在函数环境中查找变量。如果不成功,R 将继续在父环境(在您的情况下为全局环境)中进行搜索。

通过编写 environment(childFun) <- environment(),您告诉函数在 parentFun 的环境中查找变量。

如果您想了解有关环境的更多信息,我推荐 this book