为什么R省略号(...)在使用嵌套函数时会匹配更多参数?

Why does R ellipsis (...) match more arguments when using nested functions?

我想了解为什么 ... 参数在 g().

中嵌套 f() 时匹配 extra 参数

f()就是这个函数:

f <- function(..., extra = NULL) {
    . <- list(...)
    print(.)
}

正如预期的那样,输出是 ... 参数中包含的内容:

f("a", "b", "c", extra = "123")

# [[1]]
# [1] "a"

# [[2]]
# [1] "b"

# [[3]]
# [1] "c"

但是,在另一个函数中使用它时,说 g():

g <- function(..., extra = NULL) {
    f(..., extra)
}

... 还捕获了 extra 参数:

g("a", "b", "c", extra = "123")

# [[1]]
# [1] "a"

# [[2]]
# [1] "b"

# [[3]]
# [1] "c"

# [[4]]
# [1] "123"

我的问题有两个:(1) 为什么会这样,(2) 如何正确处理?

f() 中,您定义并设置了一个名为 extra 的参数,该参数从未使用过,因此它不会出现在任何地方。 g()中的f(..., extra)捕获g中的所有参数,并赋值给f()中的...g(..., extra)中的额外内容与f(..., extra = NULL)中的额外内容无关。他们同名却生活在不同的环境——分别是g()f()的环境。要实现相同的行为,请在函数调用中将 g() 的 extra 分配给 f() 的 extra:

g1 <- function(..., extra = NULL) {
    f(..., extra = extra)
}
> g1("a", "b", "c", extra = NULL)
[[1]]
[1] "a"

[[2]]
[1] "b"

[[3]]
[1] "c"

>