2016-08-04 31 views
2

我有一个功能很多参数。我需要抛出一个错误,如果他们的任何缺失:R检查是否有任何缺失的参数

这是可以做到像这样:

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'

如何检查参数名称的字符表示是否缺少参数?

回答

2

什么这样的事情,而不是

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()来查看实际传递给函数的内容。

+0

当涉及到省略号时会影响吗? –

+0

@NicholasHamilton那么,你可以测试它,让我知道你是否想要不同的行为。 – MrFlick

+0

我刚刚做过。完美的作品。谢谢。 –

相关问题