2016-08-04 10 views
2

私はMANYという引数を持っています。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") 
} 

をしかし、私の実際の場合は、上記の簡単な例よりも多くの引数が含まれ、そのように:

はこれがそうのように行うことができます。それらのANYが欠落している場合、私は、エラーをスローする必要があります、私はむしろ、ループを使用して同等のチェックを実行するだろう、このような何か:(動作しない)

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 
} 

そして、それは基本的に、我々はすべてあるべき時に関数内の変数のリストを(得るためにls()を使用して、この

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 

のように動作します引き数)、実際に関数に渡された内容を確認するためにmatch.call()を使用します。

+0

省略記号が含まれている場合にこれが有効になりますか? –

+0

@NicholasHamiltonさて、あなたはそれをテストして、違った振る舞いをしたいのなら教えてください。 – MrFlick

+0

私はちょうどしました。完璧に動作します。ありがとう。 –

関連する問題