map() e variantes tipadas
Aplique funções a listas com map(), map_dbl(), map_chr() e map_lgl().
map() e variantes tipadas é uma aula grátis de R Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de R Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de R Academy inclui 4 aulas no total.
Programação funcional com purrr
O pacote purrr fornece ferramentas consistentes e seguras quanto aos tipos para programação funcional em R. Em vez de escrever laços for, você mapeia uma função sobre uma lista ou vetor. O resultado é um código mais limpo, mais fácil de compreender e de combinar.
library(purrr)
# A list of numbers
numbers <- list(1, 4, 9, 16, 25)
# Apply sqrt() to each element
result <- map(numbers, sqrt)
print(result)map() — Sempre retorna uma lista
map(.x, .f) aplica a função .f a cada elemento de .x e retorna uma lista. A entrada pode ser uma lista, um vetor ou um quadro de dados (nesse caso, itera pelas colunas). Esta é a variante de map mais geral.
library(purrr)
# Map over a character vector
fruits <- c('apple', 'banana', 'cherry')
# nchar() counts characters in each string
result <- map(fruits, nchar)
print(result) # Returns a list
print(class(result))map_dbl() — Retorna um vetor numérico
map_dbl(.x, .f) aplica .f a .x e retorna um vetor numérico (double). Se algum resultado não for um único valor numérico, a função gerará um erro — essa segurança de tipos ajuda a detectar erros antecipadamente.
library(purrr)
groups <- list(
A = c(10, 20, 30),
B = c(5, 15, 25, 35),
C = c(100, 200)
)
# Compute mean for each group — returns a named numeric vector
means <- map_dbl(groups, mean)
print(means)
print(class(means))map_chr() — Retorna um vetor de caracteres
map_chr(.x, .f) aplica a função e retorna um vetor de caracteres. É útil para extrair atributos de texto, formatar resultados ou criar caminhos de arquivos. A função deve retornar uma única cadeia de caracteres por elemento.
library(purrr)
models <- list(
m1 = lm(mpg ~ wt, data=mtcars),
m2 = lm(mpg ~ hp, data=mtcars),
m3 = lm(mpg ~ cyl, data=mtcars)
)
# Extract the formula from each model as a string
map_chr(models, function(m) deparse(formula(m)))map_lgl() — Retorna um vetor lógico
map_lgl(.x, .f) retorna um vetor lógico de valores TRUE/FALSE. É ideal para testar condições em uma lista — por exemplo, verificar quais elementos atendem a um critério.
library(purrr)
datasets <- list(
df1 = data.frame(x=1:3, y=c(NA,2,3)),
df2 = data.frame(x=1:3, y=4:6),
df3 = data.frame(x=c(NA,NA,3), y=1:3)
)
# Does each data frame contain any NA values?
map_lgl(datasets, function(df) anyNA(df))map_int() — Retorna um vetor de inteiros
map_int(.x, .f) retorna um vetor de inteiros. Use-o quando sua função retornar contagens, índices ou outros resultados em números inteiros. Observação: em R, length() e nrow() retornam inteiros.
library(purrr)
my_lists <- list(
a = 1:10,
b = letters[1:5],
c = c(TRUE, FALSE, TRUE, TRUE)
)
# Count elements in each list item
map_int(my_lists, length)map_df() / map_dfr() — Retorna um quadro de dados
map_df(.x, .f) (alias: map_dfr()) aplica .f e combina os resultados por linhas em um único quadro de dados. A função deve retornar um quadro de dados ou tibble para cada elemento. map_dfc() combina as colunas.
library(purrr)
files <- c('sales_q1', 'sales_q2', 'sales_q3')
# Simulate reading and labeling each file
map_df(files, function(f) {
data.frame(
file = f,
rows = sample(50:100, 1),
cols = 5
)
})Funções anônimas com ~
purrr oferece uma forma abreviada e compacta de escrever funções anônimas usando fórmulas: ~expr, em que .x se refere ao elemento atual. Isso evita escrever function(x) expr e mantém o código conciso. Os dois estilos funcionam de forma idêntica.
library(purrr)
numbers <- list(1, 4, 9, 16, 25)
# Three equivalent ways:
result1 <- map(numbers, function(x) x^2)
result2 <- map(numbers, ~.x^2)
result3 <- map_dbl(numbers, ~.x^2)
print(result2)
print(result3)Mapeando uma lista nomeada
Quando .x é uma lista ou vetor nomeado, a saída de map() preserva esses nomes. map_dbl() e outras variantes tipadas também mantêm os nomes, tornando os resultados autoexplicativos.
library(purrr)
region_data <- list(
East = c(100, 120, 115, 130),
West = c(200, 195, 210, 205),
North = c(80, 85, 90, 88)
)
# Named results
map_dbl(region_data, mean)Usando map() com colunas de quadros de dados
Um quadro de dados é uma lista de colunas. map(df, fn) aplica fn a cada coluna. Combinado com map_dbl(), esse é um modo compacto de calcular uma estatística para todas as colunas de uma só vez.
library(purrr)
df <- data.frame(
score_a = c(85, 90, 78, 92),
score_b = c(88, 85, 80, 95),
score_c = c(92, 88, 84, 90)
)
# Mean of every column
map_dbl(df, mean)Aninhando chamadas de map()
É possível aninhar chamadas de map() para realizar iterações em vários níveis — o map externo percorre os grupos, e o map interno percorre os parâmetros. Isso substitui laços for aninhados por uma estrutura limpa e combinável. Para manter a legibilidade, limite o aninhamento a 2 níveis.
library(purrr)
groups <- list(A = 1:5, B = 6:10)
functions <- list(mean=mean, sd=sd, min=min)
# Apply each function to each group
map(groups, function(g) {
map_dbl(functions, function(f) f(g))
})Verificação rápida
Qual é a principal diferença entre map() e map_dbl()?
Recapitulação: map() e variantes tipadas
Principais pontos sobre map() e as variantes tipadas:
map(.x, .f)— sempre retorna uma lista; é a opção mais flexívelmap_dbl()— retorna um vetor numérico; gera erros para tipos incorretosmap_chr()— retorna um vetor de caracteresmap_lgl()— retorna um vetor lógicomap_int()— retorna um vetor de inteirosmap_df()/map_dfr()— combina os resultados por linhas em um quadro de dados- Forma abreviada
~.x— sintaxe compacta para uma função anônima - Entradas nomeadas produzem saídas nomeadas automaticamente
library(purrr)
# Typed map showcase
data_list <- list(
group_A = c(10, 20, 30),
group_B = c(5, 15),
group_C = c(100, 200, 300, 400)
)
cat('Counts:', map_int(data_list, length), '\n')
cat('Means: ', map_dbl(data_list, mean), '\n')
cat('Any>50:', map_lgl(data_list, ~any(.x > 50)), '\n')Perguntas Frequentes
A aula “map() e variantes tipadas” é grátis?
Sim — o texto completo de “map() e variantes tipadas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de R Academy, atualize para CoddyKit PRO. O curso de R Academy inclui 4 aulas no total.
O que vou aprender em “map() e variantes tipadas”?
Aplique funções a listas com map(), map_dbl(), map_chr() e map_lgl(). Você pratica R Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar R Academy?
Nenhuma experiência prévia é necessária. R Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “map() e variantes tipadas”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de R Academy?
Sim. Cada aula de R Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- map() e variantes tipadas
- map2() e pmap() para várias entradas
- reduce(), accumulate() e walk()
- keep(), discard() e filtragem de listas