R 中的 Nargin 函数(函数输入的数量)

Nargin function in R (number of function inputs)

目标

我正在尝试在 R 中创建一个函数来复制 homonymous MATLAB function 的功能,其中 return 是传递给函数的参数数量。

例子

考虑以下函数:

addme <- function(a, b) {
    if (nargin() == 2) {
        c <- a + b
    } else if (nargin() == 1) {
        c <- a + a
    } else {
        c <- 0
    }
    return(c)
}

一旦用户运行 addme(),我希望 nargin() 基本上查看传递了多少个参数——2(ab),只有 1( a) 或 none——并据此计算 c

我试过的

在花了很多时间摆弄环境之后,这是我最接近可行的解决方案:

nargin <- function() {
    length(as.list(match.call(envir = parent.env(environment()))))
}

这个函数的问题是它总是 returns 0,原因是我认为它正在查看它自己的环境而不是它父级的环境(尽管我尝试投入parent.env 那里)。

我知道我可以在 addme() 中使用 missing()args() 来实现相同的功能,但在我的项目中我会多次需要它,所以将它包装在一个函数中绝对是我应该尝试做的事情。

问题

如何获得 nargin() 到 return 传递给其父函数的参数数量?

你可以使用

nargin <- function() {
  if(sys.nframe()<2) stop("must be called from inside a function")
  length(as.list(sys.call(-1)))-1
}

基本上,您只需使用 sys.call(-1) 将调用堆栈上升到调用函数并获取它的调用,然后计算元素的数量并为函数名称本身减一。