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

Count number of arguments passed to function

我对计算传递给函数的参数数量很感兴趣。 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

问题

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

怎么样

myCount <- function(...) {length(match.call())-1}

这只是检查传递的调用(并删除函数名称本身的 1)

这里有一种使用 length()purrr::lift_*() 系列函数的优雅方式。

通常您将多个参数传递给 length(),这是行不通的,因为 length() 将向量或列表作为输入。

所以我们需要的是将输入从vector/list转换为...(点)。 purrr::lift_*() 系列提供了一系列这样做的功能。

一个选项可以从矢量转换为点:

> lift_vd(length)(2, 2, 2, 2, 2)
[1] 5

另一个选项可以从列表转换为点:

> lift_ld(length)(2, 2, 2, 2, 2)
[1] 5

这两个选项都运行良好,您需要在 length() 上使用 purrr::lift_*() 函数之一,然后再将拼接参数传递给它。

nargs returns 提供给该函数的参数数量

myCount <- function(...) {
  nargs()
}

> myCount(2,2,2,2,2)
[1] 5

引用https://stat.ethz.ch/R-manual/R-devel/library/base/html/nargs.html