【发布时间】:2017-04-07 18:10:39
【问题描述】:
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内的函数(这会很麻烦,并会造成复制/粘贴错误的机会)
定义某种“子全局”环境,并将我希望每个人都使用的东西放在这个环境中,然后让每个函数都能够从“子全局”访问东西是否有意义?然后以某种方式确保子全局始终是全局的严格子集?如果明智的话,我该怎么做?
【问题讨论】:
-
一个 hacky 修复,可以让一切按原样运行,可以在调用
f1之前在线路上使用environment(f1) = environment()f2因为f1在 @987654331 中搜索f@。顺便说一句,全球f1不会受到f2中的此更改的影响。尽管我同意 Konrad 的观点,要么将显式函数作为参数传递,要么在方便时采用类系统。