2011-11-01 8 views
38

ho una funzione f che accetta due parametri (p1 e p2):test se un argomento di una funzione è impostata oppure no nella R

Se per il parametro p2 nessun valore è stato passato alla funzione, il valore di p1^2 dovrebbe invece essere usato. Ma come posso scoprire all'interno della funzione, se un valore è dato o meno. Il problema è che la variabile p2 non è inizializzata se non c'era alcun valore. Quindi non posso provare per p2NULL.

f <- function(p1, p2) { 
    if(is.null(p2)) { 
     p2=p1^2 
    } 
    p1-p2 
} 

E 'in qualche modo possibile per verificare se un valore per p2 è stato passato alla funzione o no? (Non sono riuscito a trovare una funzione isset() o simile.)

risposta

46

Si utilizza la funzione missing() per quello.

f <- function(p1, p2) { 
    if(missing(p2)) { 
     p2=p1^2 
    } 
    p1-p2 
} 

In alternativa, è possibile impostare il valore di p2 su NULL per impostazione predefinita. A volte preferisco questa soluzione, poiché consente di passare argomenti a funzioni annidate.

f <- function(p1, p2=NULL) { 
    if(is.null(p2)) { 
     p2=p1^2 
    } 
    p1-p2 
} 

f.wrapper <-function(p1,p2=NULL){ 
    p1 <- 2*p1 
    f(p1,p2) 
} 
> f.wrapper(1) 
[1] -2 
> f.wrapper(1,3) 
[1] -1 

EDIT: si potrebbe fare questo tecnicamente con missing() pure, ma poi si dovrà includere una dichiarazione missing() in f.wrapper pure.

+1

+1 per il 'alternativa di default NULL'. Ri: l'EDIT che hai aggiunto, come passeresti "missing''ness attraverso la funzione wrapper? –

+0

@ JoshO'Brien Passare "missing'-ness on è complicato AFAIK - ma possibile. Ecco perché 'NULL' è molto più facile in questo caso. – Tommy

+0

... Quindi una domanda separata potrebbe essere giustificata per il superamento di "missing'-ness on. – Tommy

7

Penso che "manca" dovrebbe farlo.

Problemi correlati