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