fa <- function(x){x+1}
fb <- function(x){x-1}
f1 <- function(x, y){f(x)^y}
f2 <- function(x, ab, y){
if(ab == 'a'){
f <- fa
} else {
f <- fb
}
f1(x, y)
}
f2(0, 'a', .5)
Error in f1(x, y) : could not find function "f"
上面的代码不起作用,因为 f
没有在 f1
的环境中定义。
完成这项工作的好方法是什么?那个
f2
的环境f2
中重新定义函数(这会很麻烦并且会造成复制/粘贴错误的机会)定义某种“亚全局”环境,将我希望每个人都使用的东西放在这个环境中,然后让每个函数都能够访问“亚全局”中的东西是否有意义?然后以某种方式确保 subglobal 始终是 global 的严格子集?如果明智的话,我该怎么做?
最佳答案
The above doesn't work because
fa
andfb
aren't defined inf2
's environment.
不——他们是。错误是完全不同的:
f1 <- function(x, y){f(x)^y}
这里你使用了一个 undefined variable f
,这是一个错误。
您在 f2
中有一个不同的变量(容易混淆地称为 f
)。然而,这与 f1
无关,因为 f1
和 f2
不共享它们的局部变量。如果您想将 f2
的 f
传递给 f1
,则需要将其作为参数传递。
顺便说一句,您的变量名如此相似这一事实使这变得比必要的更复杂。如果将代码更改为以下等效代码,问题就会变得更加清晰:
plus1 = function (x) x + 1
minus1 = function (x) x - 1
f_exp = function (x, y) g(x) ^ y
plusminus_exp = function (x, ab, y) {
if (ab == 'a')
f = plus1
else
f = minus1
f_exp(x, y)
}
plusminus_exp(0, 'a', .5)
# Error in f_exp(x, y) : could not find function "g"
这是解决方法:
f_exp = function (x, y, g) g(x) ^ y
f_exp(x, y, f)
或者,如果您在 plusminus_exp
中多次调用 f_exp
,您可以使用一些更高级的抽象来创建一个函数生成器:返回另一个函数的函数:
make_f_exp = function (f) {
force(f)
function (x, y)
f(x) ^ y
}
plusminus_exp = function (x, ab, y) {
f = if (ab == 'a') plus1 else minus1
f_exp = make_f_exp(f)
f_exp(x, y)
}
这使得 f_exp
可插入但隔离效果以避免引入全局可修改状态。对于函数式编程语言来说,这是相当标准的代码,但在函数式语言之外不太常见,因此对某些人来说有些令人惊讶。
关于r - 函数不能 "see"全局环境中定义的其他函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40769457/