2010-02-01 10 views
38

mio codice R finisce contenente pletora di affermazioni del tipo:alternativa al R

if (!is.null(aVariable)) { 
    do whatever 
} 

Ma questo tipo di affermazione è difficile da leggere perché contiene due negazioni. Io preferirei qualcosa di simile:!

if (is.defined(aVariable)) { 
     do whatever 
} 

funziona una is.defined tipo che fa il contrario di is.null esistono standard R?

applausi, Yannick

+1

Da dove proviene una variabile? è un elemento in un vettore, un argomento globale o non vettoriale di una funzione? Potrei avere più suggerimenti –

+0

forse "esiste" è vicino a quello che stai cercando –

+1

vedi il commento di Harlan sotto "esiste" ... –

risposta

23

Si può essere meglio lavorare fuori che valore digitare la funzione o il codice di accetta, e chiedendo che:

if (is.integer(aVariable)) 
{ 
    do whatever 
} 

questo può essere un miglioramento rispetto isnull, perché fornisce il controllo del tipo. D'altra parte, potrebbe ridurre la genericità del tuo codice.

In alternativa, basta fare la funzione che si desidera:

is.defined = function(x)!is.null(x) 
+2

Il nome "is.defined" non è corretto dato che puoi dichiarare una variabile con il valore "NULL". . Prova, ad es. 'x <- NULL; x'. 'isnt.null' sarebbe un nome più appropriato per la funzione. –

+0

in perl, almeno, una variabile è considerata non definita se ha il valore undef, che è come null. –

7

Ian mettere questo nel commento, ma penso che sia una buona risposta:

if (exists("aVariable")) 
{ 
    do whatever 
} 

nota che il nome della variabile è citato.

+13

Non penso che sia lo stesso. 'exists' verifica se la variabile è vincolata. 'is.null' assume che la variabile sia vincolata e verifica se il suo contenuto è o meno l'oggetto NULL. Non sono intercambiabili. – Harlan

14

Se è solo una questione di facile lettura, si può sempre definire la propria funzione:

is.not.null <- function(x) ! is.null(x) 

in modo da poter usare tutto lungo il vostro programma.

is.not.null(3) 
is.not.null(NULL) 
1

Il pacchetto shiny fornisce le funzioni utili validate() e need() per controllare che le variabili sono entrambi disponibili e validi. need() valuta un'espressione. Se l'espressione non è valida, viene restituito un messaggio di errore. Se l'espressione è valida, viene restituito NULL. Si può usare questo per verificare se una variabile è valida. Vedere ?need per ulteriori informazioni.

Suggerisco definisce una funzione come questa:

is.valid <- function(x) { 
    require(shiny) 
    is.null(need(x, message = FALSE)) 
} 

Questa funzione is.valid() sarà tornare FALSE se x è FALSE, NULL, NA, NaN, una stringa vuota "", un vettore atomico vuoto, un vettore contenente solo valori mancanti, un vettore logico contenente solo FALSE o un oggetto della classe try-error. In tutti gli altri casi, restituisce TRUE.

Ciò significa che need() (e is.valid()) copre una gamma molto ampia di casi di errore.Invece di scrivere:

if (!is.null(x) && !is.na(x) && !is.nan(x)) { 
    ... 
} 

si può scrivere semplicemente:

if (is.valid(x)) { 
    ... 
} 

Con l'assegno per la classe try-error, può essere anche utilizzato in combinazione con un blocco try() per catturare silenziosamente errori: (vedi https://csgillespie.github.io/efficientR/programming.html#communicating-with-the-user)

bad = try(1 + "1", silent = TRUE) 
if (is.valid(bad)) { 
    ... 
}