使用全局变量作为 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。
有很多关于使用 <<-
或 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。