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] TRUE

Veja 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] NA

Agora, 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] NA

Repare 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.


Curso-R