3.9 Listas
Chegamos ao último tópico antes de voltarmos aos data frames: as listas.
Listas são objetos muito importantes dentro do R. Primeiro porque todo data frame é uma lista. Segundo porque elas são bem parecidas com vetores, mas com uma diferença essencial: você pode misturar diferentes classes de objetos dentro dela.
Para criar uma lista, rodamos list(valor1, valor2, valor3).
list(1, "a", TRUE)
## [[1]]
## [1] 1
## 
## [[2]]
## [1] "a"
## 
## [[3]]
## [1] TRUEVeja que não houve coerção. Ainda temos um valor número, um texto e um valor lógico dentro da lista.
O subsetting de listas é um pouco diferente do que o de vetores. Isso porque cada elemento de uma lista também é uma lista. Veja o que acontece se tentarmos usar [] para pegar um elemento de uma lista.
lista <- list(1, "a", TRUE)
lista[1]
## [[1]]
## [1] 1
class(lista[1])
## [1] "list"O R nos retorna uma lista com apenas aquele elemento. Se quisermos o elemento de fato dentro de cada posição, precisamos usar dois colchetes:
lista[[1]]
## [1] 1
class(lista[[1]])
## [1] "numeric"Cada elemento de uma lista ser uma lista é importante pois isso nos permite colocar vetores de tamanhos diferentes em cada posição. Isso faz das listas uma estrutura bem flexível para guardar dados.
lista <- list(1:3, "a", c(TRUE, TRUE, FALSE, FALSE))
lista
## [[1]]
## [1] 1 2 3
## 
## [[2]]
## [1] "a"
## 
## [[3]]
## [1]  TRUE  TRUE FALSE FALSE
lista[1]
## [[1]]
## [1] 1 2 3
lista[2]
## [[1]]
## [1] "a"
lista[3]
## [[1]]
## [1]  TRUE  TRUE FALSE FALSEÉ muito comum darmos nomes para cada posição de uma lista.
dados_cliente <- list(cliente = "Ana Silva", idade = 25, estado_civil = NA)
dados_cliente
## $cliente
## [1] "Ana Silva"
## 
## $idade
## [1] 25
## 
## $estado_civil
## [1] NAAgora, dentro da lista, o valor Ana Silva, por exemplo, está sendo atribuído ao nome cliente. Esse nome só existirá dentro da lista.
Um detalhe importante: os iguais utilizados nas atribuições dos nomes dentro da lista não podem ser substituídos por <-.
Quando as posições de uma lista tem nome, podemos acessar seus valores diretamente utilizando o operador $.
dados_cliente$cliente
## [1] "Ana Silva"
dados_cliente$idade
## [1] 25
dados_cliente$estado_civil
## [1] NARepare que o R devolve o valor dentro de cada posição, e não uma lista.
dados_cliente[1]
## $cliente
## [1] "Ana Silva"
dados_cliente$cliente
## [1] "Ana Silva"
class(dados_cliente[1])
## [1] "list"
class(dados_cliente$cliente)
## [1] "character"Isto implica que, nesse exemplo, dados_cliente$cliente é equivalente a dados_cliente[[1]].
Conforme ficamos mais e mais proficientes na linguagem R, as listas passam a ficar cada vez mais frequentes. Voltaremos a falar delas diversas vezes nos próximos capítulos, em especial no Capítulo 10.