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

时间:2020-08-05 08:15:55

标签: r matlab function package global-variables

关于使用<<-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长几百行,其中包含几个孩子,它们可能一样长。换句话说,嵌套基本上不在桌面上

这些也是包中的函数,因此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

1 个答案:

答案 0 :(得分:2)

一种可能性是改变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