R:为什么在省略号是最后一个参数时为省略号(...)提供列表不起作用?

kak*_*sat 3 r function list ellipsis

我正在编写一个利用省略号(又名...)的函数.它允许您指定可变数量的其他参数.我想提供一个带参数的列表作为附加参数.以下是可重现的示例:

f <- function(..., a =1, b = 2){
  l <- list(...)
  print(l)
}
f(list(a = 2))

[[1]]
[[1]]$a
[1] 2
Run Code Online (Sandbox Code Playgroud)

在列表中提供附加参数的目的是避免名称冲突(内部函数f可以采用命名参数a,我希望确保提供它的可能性).

在更改实现时,我注意到将省略号移动到函数声明中的最后一个位置会返回不同的结果(即空列表):

g <- function(a =1, b = 2, ...){
  l <- list(...)
  print(l)
}
g(list(a = 2))

list()
Run Code Online (Sandbox Code Playgroud)

好奇,我添加了两个函数的默认参数:

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
Run Code Online (Sandbox Code Playgroud)

因此,第一个函数(f)返回了预期的输出,但第二个(g)忽略(?)默认参数,a并以某种方式修改了由省略号提供的列表.

我想了解为什么两个输出彼此不同.这是否意味着只有当省略号是函数调用中的第一个参数时,才能将列表作为附加参数传递?

iod*_*iod 5

R中参数的工作方式是,当你没有命名你的第一个参数时,R只假设它进入函数的第一个参数.对于参数列表中的第二个,第三个等参数,对于后面的参数,这是正确的...- 因为R不知道你打算适应多少个参数...,如果你想改变任何来的默认值在它之后,你必须命名它.

所以在你的情况下,当你调用函数时f(),对象list(a=2)会进入....但在g()同一个对象中.你可以得到的东西进入的唯一途径...时被放置在参数列表的末尾,而不包括arguements A和B是命名它的东西是不是a或b,如克(C =名单(A = 1) ).