繁体   English   中英

函数无法“查看”全局环境中定义的其他函数

[英]Function can't “see” other functions defined in global environment

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的严格子集? 如果明智的话,我该怎么做?

上面的方法不起作用,因为fafb不在f2的环境中定义。

不,他们 错误完全不同:

f1 <- function(x, y){f(x)^y}

在这里,您使用的是未定义的变量f ,这是一个错误。

f2内部您有一个不同的变量 (也容易称为f )。 但是,这与f1无关,因为f1f2不共享它们的局部变量。 如果要将f2f传递给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)

另外,如果要调用f_exp内多次plusminus_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可插拔,但隔离效果以避免引入全局可修改状态。 对于功能性编程语言来说,这是相当标准的代码,但在功能性语言之外却很少见,因此对某些人来说有些意外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM