计算传递给函数的参数数量

时间:2017-05-16 21:30:31

标签: r function ellipsis

我有兴趣计算传递给函数的一些参数。 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

问题

这非常低效。我在大量的参数上调用这个函数,创建列表只是为了计算对象的数量是浪费。返回传递给函数的参数数量的更好方法是什么?

3 个答案:

答案 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()函数之一。