2016-08-04 32 views
2

Ich habe eine Funktion mit viele Argumente. Ich brauche einen Fehler zu werfen, wenn ANY von ihnen fehlen:R überprüfen, ob fehlende Argumente

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") 
} 

Aber mein eigentlichen Fall enthält viele mehr Argumente als das oben triviale Beispiel, und als solche:

Dies kann wie so getan werden, ich würde lieber eine gleichwertige Prüfung mit einer Schleife, in etwa so aus:

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)) 
    } 
} 

Die oben (was nicht funktioniert) wirft einen Fehler:

Error in missing(as.name(n)) : invalid use of 'missing'

Wie kann ich überprüfen, ob ein Argument in einer Zeichendarstellung des Argumentnamens fehlt?

Antwort

2

Was ist so etwas wie statt

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 
} 

Und es funktioniert wie diese

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 

Grundsätzlich wir ls() verwenden, um eine Liste von Variablen in der Funktion zu dem Zeitpunkt zu bekommen (die alle sein sollte, die Argumente) und dann verwenden wir match.call(), um zu sehen, was tatsächlich an die Funktion übergeben wurde.

+0

Wird dies bewirkt, wenn Ellipse beteiligt ist? –

+0

@ NicholasHamilton Nun, Sie könnten es testen und lassen Sie mich wissen, wenn Sie anderes Verhalten möchten. – MrFlick

+0

habe ich gerade getan. Funktioniert perfekt. Vielen Dank. –