0Pricing
R Academy · Aula

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ível
  • map_dbl() — retorna um vetor numérico; gera erros para tipos incorretos
  • map_chr() — retorna um vetor de caracteres
  • map_lgl() — retorna um vetor lógico
  • map_int() — retorna um vetor de inteiros
  • map_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

  1. map() e variantes tipadas
  2. map2() e pmap() para várias entradas
  3. reduce(), accumulate() e walk()
  4. keep(), discard() e filtragem de listas
← Voltar para R Academy