我正在编写一个利用省略号(又名 ...
)的函数。它允许您指定可变数量的附加参数。我想提供一个带有参数的列表作为附加参数。下面是一个可重现的示例:
f <- function(..., a =1, b = 2){
l <- list(...)
print(l)
}
f(list(a = 2))
[[1]]
[[1]]$a
[1] 2
在列表中提供额外参数的目的是避免名称冲突(
f
中的函数可以接受一个名为 a
的参数,我想确保提供它的可能性)。在更改实现时,我注意到将省略号移到函数声明中的最后一个位置会返回不同的结果(即空列表):
g <- function(a =1, b = 2, ...){
l <- list(...)
print(l)
}
g(list(a = 2))
list()
出于好奇,我添加了打印两个函数的默认参数:
f <- function(..., a =1, b = 2){
l <- list(...)
print(l)
print(c(a = a, b = b))
}
g <- function(a =1, b = 2, ...){
l <- list(...)
print(l)
print(c(a = a, b = b))
}
f(list(a = 2)) # results of calling f
[[1]]
[[1]]$a
[1] 2
a b
1 2
g(list(a = 2)) # results of calling g
list()
$a.a
[1] 2
$b
[1] 2
因此,第一个函数(
f
)返回了预期的输出,但第二个函数( g
)忽略了(?)默认参数 a
并以某种方式修改了由于省略号提供的列表。我想了解为什么两个输出彼此不同。这是否意味着仅当省略号是函数调用中的第一个参数时才可以将列表作为附加参数传递?
最佳答案
R 中参数的工作方式是,当你没有命名你的第一个参数时,R 只是假设它进入函数的第一个参数。对于参数列表中的第二个、第三个等参数都是如此,除了 ...
之后的参数。 - 因为 R 不知道您打算将多少参数放入 ...
, 如果你想改变它后面的任何东西的默认值,你必须给它命名。
所以在你的情况下,当你调用函数 f()
, 对象 list(a=2)
进入...
.但在 g()
,同一个对象进入 a。您可以将某些东西放入 ...
的唯一方法当它被放置在参数列表的末尾而不包括 a 和 b 的参数时是将它命名为不是 a 或 b 的东西,例如g(c=list(a=1))。
关于R:当省略号是最后一个参数时,为什么向省略号 (...) 提供列表不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49457010/