Muitas linguagens têm uma forma como null ou none de indicar um valor inexistente.
Como o R foi projetado para lidar com grandes volumes de dados (muitas vezes bagunçados), ele tem várias formas de representar o nada.
O objetivo geral é sinalizar valores ausentes ou suspeitos conforme eles aparecem e depois continuar, sem gerar uma exceção.
Se um valor realmente não existe, ele é representado por NULL. Provavelmente é o mais próximo do que C ou Python fariam.
v <- c() # zero-length vector
v
#> NULL
is.null(v)
#> [1] TRUE
Em muitos contextos, valores NULL são simplesmente ignorados:
c(2, 3, NULL, 5)
#> [1] 2 3 5
Para situações em que um valor existe, mas não sabemos qual é, usa-se NA. Por exemplo, ao contar veículos que trafegam em uma estrada, os observadores humanos podem ficar doentes ou os sensores automáticos podem quebrar, mas o trânsito continua fluindo.
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
Assim, NA é um marcador que avisa às pessoas que elas precisam decidir como lidar com isso.
Funções estatísticas normalmente retornam NA por padrão se houver valores NA presentes.
Se você quiser que esses valores sejam ignorados, use o parâmetro na.rm (NA remove) para deixar isso explícito:
v <- c(1, 2, NA, 4, 5)
mean(v)
#> [1] NA
mean(v, na.rm = TRUE)
#> [1] 3
Abreviação de "Not a Number" ("não é um número"), NaN sinaliza um problema de cálculo em situações em que se esperava um número.
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
Essa não é a única possibilidade de cálculo "inválido".
Dividir por zero retorna Inf ou -Inf quando o numerador é diferente de zero, sem gerar um erro.
1 / 0
#> [1] Inf
Talvez surpreendentemente, o R não tem uma forma padrão de verificar se algo está vazio, embora alguns pacotes de terceiros implementem suas próprias funções, como is.empty().
Até mesmo gerar um vetor vazio não é totalmente óbvio.
Vimos em uma seção anterior que c() sem argumentos retorna NULL, e não um vetor.
is.vector(c())
#> [1] FALSE
Funções como logical() ou integer() recebem um argumento que especifica o comprimento desejado, que pode ser zero.
z <- logical(0)
is.vector(z)
#> [1] TRUE
length(z)
#> [1] 0
Também podemos gerar um vetor e depois remover todos os elementos, como descrito no Conceito de Vetores. Isso resulta em um vetor de comprimento 0 de um tipo apropriado.
v <- 5
v[-1] # delete the first element
#> numeric(0)