【问题标题】:How to specify arguments after dots ... in R?如何在R中的点...之后指定参数?
【发布时间】:2015-01-24 04:19:25
【问题描述】:

这可能归结为“如何将可选参数传递给 R 函数”。 以c() 为例。它的定义是:

c(..., recursive = FALSE)

但是,如果我像这样使用它c(1:5, TRUE),它会给出[1] 1 2 3 4 5 1,这是完全可以理解的,但也有点奇怪,因为我希望它很容易弄清楚。我想这很简单,我根本没有看到整个事情。

为回答而欢呼,而不是愤怒。我用谷歌搜索了 SO,但可能得到了太多错误的答案并放弃了。

编辑:由于不合逻辑的例子而被编辑。

【问题讨论】:

  • 如果参数在点之后,你应该命名它。
  • 相反,如果参数在点之后,您必须为其命名。 c(1:5, recursive = FALSE).
  • 完美。我开始从我偶然发现的一组课程中学习,这似乎是某种速成课程......所以我崩溃了:)
  • 另外,FALSE 是默认值。 recursive 参数在您使用它的方式上真的没用。它更多地用于连接列表项。 c(as.list(1:5), recursive=TRUE)。还值得补充的是,在... 之后,参数部分匹配。你必须写全名
  • 感谢理查德指出。实际上,我的目标是“如何设置可选参数”。仍然是一个好点 - 我编辑了帖子。

标签: r


【解决方案1】:

我一直在等待第一批评论者是否会回答,但他们没有,所以我会的。

由于在c() 的定义中,第一个参数是...,因此您必须完整命名后面的所有参数才能使其正常工作。我说参数复数而不是参数单数,因为实际上在c() 中有第二个未记录的参数。有关更多信息,请参阅Why does function c() accept an undocumented argument?。对于... 之前的参数,您可以使用部分参数匹配,但对于... 之后的参数,您必须填写完整的参数名称。

您的示例中发生的情况是您将TRUE(即1)的数值连接到向量1:5

as.numeric(TRUE)            ## numeric value of TRUE
# [1] 1
c(1:5, TRUE)                ## try no arg name, wrong result
# [1] 1 2 3 4 5 1
c(1:5, rec=TRUE)            ## try partial arg matching, wrong result
#                    rec 
#  1   2   3   4   5   1 

此外,recursive 实际上并没有以您尝试使用它的方式做任何事情。

c(1:5)
# [1] 1 2 3 4 5
c(1:5, recursive=TRUE)      ## 1:5 not recursive, same result
# [1] 1 2 3 4 5
is.recursive(c(1:5))
# [1] FALSE

更多的是用于连接列表项或任何其他递归对象(请参阅?is.recursive)。

(x <- as.list(1:5))
# [[1]]
# [1] 1
# 
# [[2]]
# [1] 2
# 
# [[3]]
# [1] 3
# 
# [[4]]
# [1] 4
# 
# [[5]]
# [1] 5
is.recursive(x)
# [1] TRUE
c(x, recursive=TRUE)        ## correct usage on recursive object x
# [1] 1 2 3 4 5

【讨论】:

  • 恭喜获得 20K(加一)
  • 再次恭喜获得 20K。 :)
  • 非常感谢您的回答。结果被多次投票,以及问题。不太确定为什么会出现 3 个关闭建议。人们总是很高兴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2016-09-23
  • 1970-01-01
  • 2014-08-10
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多