【问题标题】:Count number of arguments passed to function计算传递给函数的参数数量
【发布时间】:2017-10-16 03:39:50
【问题描述】:

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

问题

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

【问题讨论】:

  • @Gregor 公平点,我删除了第一位。
  • '用substatnial数量的参数调用'听起来你在做一些奇怪的事情。函数参数是为程序员准备的,机器应该得到太长的列表,人类无法阅读 - 例如 - list :)
  • @liborm 我同意更广泛的方案。在这种特殊情况下,我对这个解决方案很感兴趣,因为当我通过get("sum")(arg, arg) 调用函数时,它可以帮助我更改更长的工作流程。从教育的角度来看,我还想看看如何以有效的方式做到这一点。

标签: r function ellipsis


【解决方案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】:

    这是一种将length()purrr::lift_*() 家族函数结合使用的优雅方式。

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

    所以我们需要将输入从向量/列表转换为...(点)。 purrr::lift_*()family 提供了一系列功能。

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      怎么样

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

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

      【讨论】:

      • 完美,这就是我想要的。
      • 是否也可以计算函数内部的参数数量?
      猜你喜欢
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多