![](/img/trans.png)
[英]Keep user-defined functions in global environment, during removal of objects
[英]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的严格子集? 如果明智的话,我该怎么做?
上面的方法不起作用,因为
fa
和fb
不在f2
的环境中定义。
不,他们是 。 错误完全不同:
f1 <- function(x, y){f(x)^y}
在这里,您使用的是未定义的变量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)
另外,如果要调用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.