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

Adr*_*ian 7 arguments r function

为什么

f <- function(a) {
    g <- function(a=a) {
        return(a + 2)
    }
    return(g())
}
f(3)  # Error in a + 2: 'a' is missing
Run Code Online (Sandbox Code Playgroud)

导致错误?它与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
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 6

问题是,正如R语言定义中所解释的那样:

函数的默认参数在函数的求值框架中计算.

在你的第一个代码块中,当你在g()没有任何参数的情况下调用时,它会回退到它的默认值a,即a.在"函数框架"(即调用创建的环境g())中评估它,它会找到一个名称与符号匹配的参数a,其值为a.当它查找该值时a,它会找到一个名称与该符号匹配的参数,其值为a.什么时候...

正如您所看到的,您陷入了循环,这是错误消息试图告诉您的:

Error in g() : 
  promise already under evaluation: recursive default argument reference or 
earlier problems?
Run Code Online (Sandbox Code Playgroud)

你的第二次尝试调用g(a)按预期工作,因为你提供了一个参数,并且如R-lang的相同部分所述:

在函数的评估框架中计算提供的函数参数.

在那里它找到一个符号a,它绑定到你传递给外部函数的形式参数的任何值a,一切都很好.