2013-10-29 19 views
13

C'è una funzione in R che si comporta in questo modo:Una funzione che restituisce TRUE su NA, NULL, NaN in R?

isnothing = function(x) { 
    is.null(x) | is.na(x) | is.nan(x) 
} 
+3

Io davvero non credo che ci sia una funzione di base che fa questo. NULL e NA sono due cose completamente diverse, e il test che stai suggerendo è l'inserimento dei due concetti. – shadow

+0

Il punto di tale funzione sarebbe la codifica difensiva quando si tratta di utenti inesperti e/o incompetenti, molti dei quali presenti nella comunità R. – Backlin

+1

@Backlin la difesa del go-to per quello scenario * dovrebbe essere * ** RTFM **. Penso che educare la comunità sia meglio che assumere che siano stupidi (ma +1 per la tua funzione). –

risposta

11

mi mancava anche tale funzione e aggiunto questo ai miei .Rprofile secoli fa. Se qualcuno conosce una funzione di base che fa la stessa cosa voglio anche sapere.

is.blank <- function(x, false.triggers=FALSE){ 
    if(is.function(x)) return(FALSE) # Some of the tests below trigger 
            # warnings when used on functions 
    return(
     is.null(x) ||    # Actually this line is unnecessary since 
     length(x) == 0 ||   # length(NULL) = 0, but I like to be clear 
     all(is.na(x)) || 
     all(x=="") || 
     (false.triggers && all(!x)) 
    ) 
} 

Come @shadow accennato, NA, NaN e NULL hanno significati differenti che sono importanti per capire. Tuttavia, trovo questa funzione utile quando creo funzioni contenenti argomenti facoltativi con valori predefiniti, che voglio consentire all'utente di sopprimerli impostandoli su qualsiasi valore "non definito".

Uno di questi esempi è xlab di plot. Non ricordo mai se è xlab=NA, xlab=FALSE, xlab=NULL o xlab="". Alcuni producono il risultato desiderato e altri no, quindi ho trovato conveniente prendere tutto con la funzione precedente quando sviluppo codice, in particolare se anche altre persone lo useranno.

-3

consideri is.finite():

!is.finite(NA) 
# TRUE 
!is.finite(NaN) 
# TRUE 

Ma non funziona per NULL o inserimento dei caratteri:

!is.finite(NULL) 
# logical(0) 
!is.finite("foo") 
# TRUE 

anche (naturalmente)

!is.finite(Inf) 
# TRUE 
+0

er ... 'is.finite (1)' ?? -1 –

+1

Non si intende restituire "VERO" a 1? Come ho detto, ottiene 'NULL' e' Inf' sbagliati, ma potrebbe essere nella giusta direzione per OP. – Hugh

+1

Non penso che una funzione intitolata 'isnothing()' debba restituire 'TRUE' dato e input' 1', no. Scusate, cerco di evitare di votare, ma non penso che questa sia davvero una risposta utile e comunque non passa neanche tutti i test nell'OP. Bel tentativo però! –

1

Ho avuto un problema molto simile pure. Stavo cercando di verificare se i nomi delle righe di una data matrice o di un frame di dati sono corretti.

x <- matrix(1:6,ncol=2) 
isnothing = function(x) { 
    any(is.null(x)) | any(is.na(x)) | any(is.nan(x)) 
} 
isnothing(rownames(x)) 

La funzione genera un errore. Ma quando ho usato il cortocircuito e l'ho cambiato in:

isnothing = function(x) { 
    any(is.null(x)) || any(is.na(x)) || any(is.nan(x)) 
} 
isnothing(rownames(x)) 

Ha risolto il mio problema. Immagino di controllare prima la nullità e poi di andare avanti per controllare altri casi se è FALSE risolto il mio problema. L'ho controllato con un paio di casi problematici a cui riesco a pensare e ha funzionato. Non so se ci sono delle eccezioni ma per ora ha funzionato per i miei scopi.

rownames(x) <- c("a",NaN,NA) 
isnothing(rownames(x)) 
1

Credo si sono fondamentalmente alla ricerca di ciò che gtools valida funzione() fa.

?gtools::invalid 

Per esempio,

gtools::invalid(NA) 
[1] TRUE 
gtools::invalid(NULL) 
[1] TRUE 
gtools::invalid(NaN) 
[1] TRUE 
Problemi correlati