Muitas linguagens têm uma forma como null ou none de indicar um valor inexistente.
Como o R foi concebido para lidar com grandes volumes de dados (muitas vezes desorganizados), tem várias formas de representar o nada.
O objetivo geral é assinalar os valores em falta ou suspeitos à medida que são encontrados e depois continuar sem lançar uma exceção.
Se um valor não existe mesmo, é representado por NULL. Isto é provavelmente o mais próximo do que o C ou o Python fazem.
v <- c() # zero-length vector
v
#> NULL
is.null(v)
#> [1] TRUE
Em muitos contextos, os valores NULL são simplesmente ignorados:
c(2, 3, NULL, 5)
#> [1] 2 3 5
Nas situações em que o valor existe mas não sabemos qual é, usa-se NA. Por exemplo, ao contar veículos que circulam numa estrada, os observadores humanos podem ficar de baixa ou os sensores automáticos podem avariar-se, mas o trânsito continua a fluir.
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 de posição, que avisa quem está a analisar os dados de que é preciso tomar uma decisão sobre como lidar com ele.
As funções estatísticas devolvem normalmente NA por predefinição se existirem valores NA.
Se quiseres que estes valores sejam ignorados, usa o parâmetro na.rm (NA remove) para deixares isso explícito:
v <- c(1, 2, NA, 4, 5)
mean(v)
#> [1] NA
mean(v, na.rm = TRUE)
#> [1] 3
Abreviatura de "Not a Number" (não é um número), NaN assinala 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
Esta não é a única possibilidade de cálculos "inválidos".
Dividir por zero devolve Inf ou -Inf quando o numerador não é zero, sem lançar um erro.
1 / 0
#> [1] Inf
Talvez de forma surpreendente, o R não tem uma forma padrão de verificar se algo está vazio, embora alguns pacotes de terceiros implementem as suas próprias funções, como is.empty().
Mesmo gerar um vetor vazio não é assim tão óbvio.
Vimos numa secção anterior que c() sem argumentos devolve NULL, e não um vetor.
is.vector(c())
#> [1] FALSE
Funções como logical() ou integer() recebem um argumento que especifica o comprimento pretendido, 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 se descreve no Conceito de Vetores. Isto dá origem a um vetor de comprimento 0 do tipo adequado.
v <- 5
v[-1] # delete the first element
#> numeric(0)