我有一个带有 MANY 参数的函数。如果缺少 ANY ,我需要抛出错误:
这可以这样做:
testFunction = function(a,b,c,d,e,f,g,....){
if(missing(a)) stop("a is required")
if(missing(b)) stop("b is required")
if(missing(c)) stop("c is required")
if(missing(d)) stop("d is required")
if(missing(e)) stop("e is required")
if(missing(f)) stop("f is required")
if(missing(g)) stop("g is required")
}
但是我的实际案例包含的参数多于上述简单的例子,因此,我宁愿使用循环执行等效检查,如下所示:(它不起作用)
testFunction = function(a,b,c,d,e,f,g,...){
args = as.list(environment())
for(n in names(args)){
if(missing(as.name(n))) stop(sprintf("%s is required",n))
}
}
以上引发了错误:
Error in missing(as.name(n)) : invalid use of 'missing'
如何通过参数名称的字符表示来检查参数是否缺失?
答案 0 :(得分:5)
这样的事情
f <- function(a,b,c,d) {
defined <- ls()
passed <- names(as.list(match.call())[-1])
if (any(!defined %in% passed)) {
stop(paste("missing values for", paste(setdiff(defined, passed), collapse=", ")))
}
a+b+c+d
}
它就像这样
f(1)
# Error in f(1) : missing values for b, c, d
f(2, d=3)
# Error in f(2, d = 3) : missing values for b, c
f(1,2,3,4)
# [1] 10
基本上我们使用ls()
来获取当时函数中的变量列表(应该是所有参数),然后我们使用match.call()
来查看实际传递给函数的内容。