O

O nada em R

1 exercício

Sobre O nada

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.

NULL

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

NA

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

NaN

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

Vetores vazios

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)
Editar via GitHub A ligação abre numa nova janela ou separador

Aprende O nada