目标
我试图在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个(a
和b
(,只有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)
从调用堆栈向上转到调用函数,并获得它的调用,然后计算元素的数量,并为函数名称本身减去一。