这是一个相对简单的问题,但我很难过。我在R编程,但我不认为这个问题仅限于R.下面我试着编写一些简单的代码来证明问题:
f1 = function(x) {
return(a + x)
}
f2 = function(ftn) {
return(ftn(1))
}
f3 = function(a) {
return(f2(f1))
}
问题:如果我调用f3(2)[例如],则返回f2(f1),并且f2(f1)返回f1(a + 1)。但f1无法识别' a'我放入f3,所以代码不起作用!我有什么方法可以让f1识别f3的输入吗?
答案 0 :(得分:3)
R使用词法范围,而不是动态范围。函数在定义函数的环境中查找自由变量(已使用但未在其中定义的变量)。 f1
已在全局环境中定义,因此在全局环境中查找a
,并且a
没有f1
。我们可以强制f3
在f3 = function(a) {
environment(f1) <- environment()
return(f2(f1))
}
的正在运行的实例中查找其自由变量,如下所示:
f1
这会在f3
内临时创建一个具有所需环境的新f1
。
仅在f3
内需要f1
的另一种可能性是在那里定义f3 = function(a) {
f1 = function(x) {
return(a + x)
}
return(f2(f1))
}
(而不是在全球环境中):
f3 <- function(a) {
f1 <- function(x) a + x
f2(f1)
}
顺便说一下,返回在运行函数中计算的最后一个表达式,因此可以这样写:
{{1}}