De nombreux langages disposent d'un moyen comme null ou none pour indiquer une valeur inexistante.
Comme R est conçu pour traiter de grands volumes de données (souvent désordonnées), il possède plusieurs formes de néant.
L'objectif général est de signaler les valeurs manquantes ou suspectes au fur et à mesure qu'on les rencontre, puis de continuer sans lever d'exception.
Si une valeur n'existe vraiment pas, elle est représentée par NULL. C'est probablement ce qui se rapproche le plus de ce que feraient C ou Python.
v <- c() # zero-length vector
v
#> NULL
is.null(v)
#> [1] TRUE
Dans de nombreux contextes, les valeurs NULL sont simplement ignorées :
c(2, 3, NULL, 5)
#> [1] 2 3 5
Dans les situations où une valeur existe mais où l'on ne sait pas ce qu'elle est, on utilise NA. Par exemple, lorsqu'on compte les véhicules qui circulent sur une route, il arrive que les observateurs humains soient en arrêt maladie ou que les capteurs automatiques tombent en panne, mais le trafic continue de s'écouler.
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
Ainsi, NA est un marqueur qui avertit l'humain qu'il doit décider comment le traiter.
Les fonctions statistiques renvoient généralement NA par défaut si des valeurs NA sont présentes.
Si tu veux que ces valeurs soient ignorées, utilise le paramètre na.rm (NA remove) pour rendre cela explicite :
v <- c(1, 2, NA, 4, 5)
mean(v)
#> [1] NA
mean(v, na.rm = TRUE)
#> [1] 3
Abréviation de « Not a Number » (pas un nombre), NaN signale un problème de calcul dans les situations où un nombre était attendu.
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
Ce n'est pas la seule possibilité de calcul « invalide ».
Une division par zéro renvoie Inf ou -Inf lorsque le numérateur est non nul, sans lever d'erreur.
1 / 0
#> [1] Inf
Étonnamment peut-être, R n'a pas de moyen standard de vérifier qu'un vecteur est vide, même si certains paquets tiers implémentent leurs propres fonctions comme is.empty().
Même générer un vecteur vide n'est pas tout à fait évident.
On a vu dans une section précédente que c() sans argument renvoie NULL, et non un vecteur.
is.vector(c())
#> [1] FALSE
Des fonctions comme logical() ou integer() prennent un argument qui indique la longueur voulue, laquelle peut être zéro.
z <- logical(0)
is.vector(z)
#> [1] TRUE
length(z)
#> [1] 0
On peut aussi générer un vecteur puis en supprimer chaque élément, comme décrit dans le concept Vecteurs. On obtient alors un vecteur de longueur 0 du type approprié.
v <- 5
v[-1] # delete the first element
#> numeric(0)