Molti linguaggi hanno un modo, come null o none, per indicare un valore inesistente.
Dato che R è progettato per gestire grandi volumi di dati (spesso disordinati), ha diverse forme di nulla.
L'obiettivo generale è segnalare i valori mancanti o sospetti nel momento in cui li si incontra, e poi continuare senza sollevare un'eccezione.
Se un valore davvero non esiste, è rappresentato da NULL. Questo è probabilmente il comportamento più vicino a quello di C o Python.
v <- c() # zero-length vector
v
#> NULL
is.null(v)
#> [1] TRUE
In molti contesti, i valori NULL vengono semplicemente ignorati:
c(2, 3, NULL, 5)
#> [1] 2 3 5
Nei casi in cui un valore esiste ma non sappiamo quale sia, si usa NA. Per esempio, quando si contano i veicoli che percorrono una strada, gli osservatori umani potrebbero ammalarsi o i sensori automatici rompersi, ma il traffico continua a scorrere.
v <- c(1, 2, NA, 4, 5)
v
#> [1] 1 2 NA 4 5
is.na(v) # test for data gaps
#> [1] FALSE FALSE TRUE FALSE FALSE
Quindi NA è un segnaposto, che avverte chi legge che deve decidere come gestirlo.
Le funzioni statistiche di solito restituiscono NA per impostazione predefinita se sono presenti valori NA.
Se vuoi che questi valori vengano ignorati, usa il parametro na.rm (NA remove) per renderlo esplicito:
v <- c(1, 2, NA, 4, 5)
mean(v)
#> [1] NA
mean(v, na.rm = TRUE)
#> [1] 3
Abbreviazione di «Not a Number», NaN segnala un problema di calcolo nelle situazioni in cui ci si aspettava un numero.
n <- c(0, 2, 4)
d <- c(0, 1, 2)
n / d
#> [1] NaN 2 2 # 0/0 is mathematically undefined
is.nan(n / d)
#> [1] TRUE FALSE FALSE
Non è l'unica possibilità per i calcoli «non validi».
Dividere per zero restituirà Inf o -Inf se il numeratore non è zero, senza sollevare un errore.
1 / 0
#> [1] Inf
Forse in modo sorprendente, R non ha un modo standard per controllare se qualcosa è vuoto, anche se alcuni pacchetti di terze parti implementano funzioni proprie come is.empty().
Persino generare un vettore vuoto non è del tutto ovvio.
Abbiamo visto in una sezione precedente che c() senza argomenti restituisce NULL, non un vettore.
is.vector(c())
#> [1] FALSE
Funzioni come logical() o integer() accettano un argomento che specifica la lunghezza desiderata, che può essere zero.
z <- logical(0)
is.vector(z)
#> [1] TRUE
length(z)
#> [1] 0
Possiamo anche generare un vettore e poi rimuoverne ogni elemento, come descritto nel concetto di vettori. Il risultato è un vettore di lunghezza 0 del tipo appropriato.
v <- 5
v[-1] # delete the first element
#> numeric(0)