为另一个函数中定义的函数使用相同的参数名称

时间:2014-10-27 16:38:26

标签: r function arguments

为什么

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

2 个答案:

答案 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成为自己的默认值,即圆形。

相关问题