为什么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"
>
我想了解为什么 ...
参数在 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"
>