具有来自另一个函数输入的额外参数的函数

时间:2014-04-06 15:26:17

标签: r function scope

这是一个相对简单的问题,但我很难过。我在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的输入吗?

1 个答案:

答案 0 :(得分:3)

R使用词法范围,而不是动态范围。函数在定义函数的环境中查找自由变量(已使用但未在其中定义的变量)。 f1已在全局环境中定义,因此在全局环境中查找a,并且a没有f1。我们可以强制f3f3 = 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}}