【问题标题】:Nargin function in R (number of function inputs)R中的Nargin函数(函数输入的数量)
【发布时间】:2020-10-19 07:21:54
【问题描述】:

目标

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

示例

考虑下面的函数:

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)或无——并计算@ 987654328@相应。

我尝试过的

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

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

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

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

问题

如何让nargin() 返回传递给其父函数的参数数量?

【问题讨论】:

    标签: r matlab arguments environment


    【解决方案1】:

    你可以使用

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

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

    【讨论】:

    • 感谢您的快速解决方案和解释。我不知道sys.call,从现在开始我可能会更频繁地使用它。干杯!
    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 2020-06-07
    • 2020-08-22
    • 2013-06-20
    • 2022-01-12
    相关资源
    最近更新 更多