r - 函数不能 "see"全局环境中定义的其他函数

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 and fb aren't defined in f2's environment.

不——他们。错误是完全不同的:

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

这里你使用了一个 undefined variable 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)

或者,如果您在 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/

相关文章:

python-3.x - 如何为 ttk.OptionMenu 编辑 ttk 样式

.net - AWS Polly 集成 SDK

scala - 没有参数的scala方法中的模式匹配

R - 在没有分配的情况下构建具有多列的数据框

batch-file - "nircmd.exe monitor on"不工作

haskell - 如何将整数插入排序列表

laravel - 在 Laravel 5 中间件中获取 cookie

css - 从 Chrome 开发者工具样式更改输入占位符颜色

python - Airflow -BashOperator : Getting "Dag runs

macos - ld 链接器错误 - 体系结构 x86_64 的 undefined symbol