递归默认参数引用

时间:2017-03-01 19:52:24

标签: r

任何人都可以在下面的代码中解释我的错误。我以为我在这里做的是

  • 全局变量a=5
  • 的声明
  • 函数fun的定义,它接受一个默认为上述全局变量的参数a

当我在没有任何参数的情况下调用fun()时,局部变量a将成为全局变量a的副本,并且在函数代码中的任何位置它都优先于全局变量a。 {1}}(除非我专门使用get("a", envir=parent.frame)

但我一定是错的。为什么不允许?

> a = 5
> fun = function(a=a) { a + 1 }
> fun(4)
[1] 5
> fun()
Error in fun() : 
  promise already under evaluation: recursive default argument reference or earlier problems?

1 个答案:

答案 0 :(得分:1)

  

当我在没有任何参数的情况下调用fun()时,局部变量a将成为全局变量a的副本

否:在函数范围内计算默认参数。您的代码类似于以下代码:

fun = function(a) {
    if (missing(a)) a = a
    a + 1
}

这使得范围更加清晰,并解释了为什么您的代码不起作用。

请注意,对于默认参数,此为true;显式传递的参数(当然)在调用者的范围内进行评估。