递归默认参数参考



任何人都可以向我解释以下代码中的问题。我以为我在这里做的是

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

,当我致电fun()没有任何参数时,本地变量a成为全局变量a的副本,并且在功能代码中的任何点上,它优先于全局a(除非我特别使用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?

,当我致电fun()没有任何参数时,本地变量a成为全局变量a

的副本

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

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

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

请注意,这是 true true thue默认参数;明确通过的参数(当然)在呼叫者的范围中进行了评估。

最新更新