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



目标

我试图在R中创建一个函数,以复制同名MATLAB函数的功能,该函数返回传递给函数的参数数。

示例

考虑以下函数:

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(或没有——并相应地计算c

我尝试过的

在花了很多时间扰乱环境之后,这是我最接近工作解决方案的一个:

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

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

我知道我可以在addme()中使用missing()args()来实现相同的功能,但在我的整个项目中,我还需要很多次这样的功能,所以把它封装在一个函数中肯定是我应该尝试做的事情。

问题

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

您可以使用

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

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

相关内容

  • 没有找到相关文章

最新更新