关于使用<<-
或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
答案 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。