2016-08-04 52 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

我剛剛做過。完美的作品。謝謝。 –