这可能归结为“如何将可选参数传递给R函数”。
以c()
为例。它的定义是:
c(..., recursive = FALSE)
但是,如果我像c(1:5, TRUE)
一样使用它,它会给[1] 1 2 3 4 5 1
这是完全可以理解的,但也有点奇怪,因为我希望它很容易理解。我想这很简单,我根本就没有看到整件事。
欢呼回答而不是肆虐。我用Google搜索并搜索过,但可能有太多错误的答案并放弃了。
编辑:由于不合逻辑的例子而被编辑。
答案 0 :(得分:5)
我在等着看是否有任何第一批评论者要回答,但他们并非如此。
因为在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