我有兴趣计算传递给函数的一些参数。 length
不能用于此目的:
>> length(2,2,2,2,2)
Error in length(2, 2, 2, 2, 2) :
5 arguments passed to 'length' which requires 1
这很明显,因为length
需要1个参数:
length(c(2,2,2,2,2))
会产生预期的结果 - 5.
我想调用我的函数 myFunction(arg1, arg2, arg3)
。这可以使用省略号来完成:
myCount <- function(...) {length(list(...))}
myCount
会产生预期的结果:
>> myCount(2,2,2,2,2)
[1] 5
这非常低效。我在大量的参数上调用这个函数,创建列表只是为了计算对象的数量是浪费。返回传递给函数的参数数量的更好方法是什么?
答案 0 :(得分:5)
怎么样
myCount <- function(...) {length(match.call())-1}
这只是检查传递的调用(并为函数名本身删除1)
答案 1 :(得分:1)
nargs 返回提供给该函数的参数数量
myCount <- function(...) {
nargs()
}
> myCount(2,2,2,2,2)
[1] 5
参考https://stat.ethz.ch/R-manual/R-devel/library/base/html/nargs.html
答案 2 :(得分:0)
这是将length()
与purrr::lift_*()
家族函数一起使用的一种比较优雅的方法。
通常,您要将多个参数传递给length()
,因为length()
使用向量或列表作为输入,所以该参数不起作用。
因此,我们需要将输入从向量/列表转换为...
(点)。 purrr::lift_*()
系列提供了一系列功能。
一个选项可以从向量转换为点:
> lift_vd(length)(2, 2, 2, 2, 2)
[1] 5
另一个选项可以从列表转换为点:
> lift_ld(length)(2, 2, 2, 2, 2)
[1] 5
这两个选项都可以很好地工作,并且您需要在将拼接参数传递给purrr::lift_*()
之前使用length()
函数之一。