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

标签 r list function ellipsis

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

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/

相关文章:

r - 无法使用 Monetdb.R 连接到本地数据库

python - 在 Python 中将多个列表合并为一个列表

ios - 如何在函数外更改字典中的 Double 值?

r - 如果出错,让 R 不退出调试器

python - 如何在机器学习数据预处理中处理日期变量

algorithm - 优化递归序列的计算

Python:PSQL:从查询生成列表

python - 如何有效地比较 Python 中的大型列表?

python - 是否可以控制函数在 python 中的执行方式?

Swift 3 我的游戏结束代码无法正常工作