gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:19:27 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com