为什么
f <- function(a) {
g <- function(a=a) {
return(a + 2)
}
return(g())
}
f(3) # Error in a + 2: 'a' is missing
导致错误?它与a = a参数有关,特别是与变量名相同的事实。到底是怎么回事?
以下是一些按预期工作的类似代码:
f <- function(a) {
g <- function(a) {
return(a + 2)
}
return(g(a))
}
f(3) # 5
f <- function(a) {
g <- function(g_a=a) {
return(g_a + 2)
}
return(g())
}
f(3) # 5
g <- function(a) a + 2
f <- function(a) g(a)
f(3) # 5
答案 0 :(得分:6)
问题在于,as explained in the R language definition:
函数的默认参数在函数的求值框架中计算。
在您的第一个代码块中,当您在没有任何参数的情况下调用g()
时,它会回到默认值a
,即a
。在函数&#34;框架中评估该函数&#34; (即通过调用g()
创建的环境),它找到一个名称与符号a
匹配的参数,其值为a
。当它查找a
的值时,它会找到一个名称与该符号匹配的参数,其值为a
。当...
正如您所看到的,您已陷入循环中,这是错误消息试图告诉您的内容:
Error in g() :
promise already under evaluation: recursive default argument reference or
earlier problems?
您的第二次尝试({1}}会按预期工作,因为您提供了参数,as explained in the same section of R-lang:
在函数的评估框架中计算提供的函数参数。
在那里找到一个符号g(a)
,它绑定到你传递给外部函数的正式参数a
的任何值,一切都很好。
答案 1 :(得分:4)
问题在于a=a
部分。参数不能是它自己的默认值。这是一个循环参考。
此示例可能有助于阐明其工作原理:
x <- 1
f <- function(a = x) { x <- 2; a }
f()
## [1] 2
请注意a
没有默认值1;它具有默认值2.它首先在函数本身中查找默认值。以类似的方式a=a
会导致a
成为自己的默认值,即圆形。