map() y variantes tipadas
Aplique funciones sobre listas con map(), map_dbl(), map_chr() y map_lgl().
map() y variantes tipadas es una lección gratuita de R Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.
Programación funcional con purrr
El paquete purrr proporciona herramientas coherentes y seguras en cuanto a tipos para la programación funcional en R. En lugar de escribir bucles for, puede mapear una función sobre una lista o un vector. El resultado es un código más limpio, fácil de comprender y 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() — Siempre devuelve una lista
map(.x, .f) aplica la función .f a cada elemento de .x y devuelve una lista. La entrada puede ser una lista, un vector o un data frame (itera sobre las columnas). Esta es la variante de map más general.
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() — Devuelve un vector numérico
map_dbl(.x, .f) aplica .f a .x y devuelve un vector numérico (double). Si algún resultado no es un único valor numérico, genera un error; esta seguridad de tipos permite detectar errores pronto.
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() — Devuelve un vector de caracteres
map_chr(.x, .f) aplica la función y devuelve un vector de caracteres. Resulta útil para extraer atributos de texto, dar formato a resultados o crear rutas de archivos. La función debe devolver una única cadena 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() — Devuelve un vector lógico
map_lgl(.x, .f) devuelve un vector lógico de valores TRUE/FALSE. Es perfecto para comprobar condiciones en una lista; por ejemplo, para verificar qué elementos cumplen un criterio.
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() — Devuelve un vector de enteros
map_int(.x, .f) devuelve un vector de enteros. Úselo cuando su función devuelva conteos, índices u otros resultados expresados en números enteros. Nota: en R, length() y nrow() devuelven enteros.
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() — Devuelve un Data Frame
map_df(.x, .f) (alias: map_dfr()) aplica .f y combina los resultados por filas en un único data frame. La función debe devolver un data frame o tibble para cada elemento. map_dfc() los combina por columnas.
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
)
})Funciones anónimas con ~
purrr admite una notación abreviada basada en fórmulas para funciones anónimas: ~expr, donde .x hace referencia al elemento actual. Esto evita escribir function(x) expr y mantiene el código conciso. Ambos estilos funcionan 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)Mapeo sobre una lista con nombres
Cuando .x es una lista o un vector con nombres, la salida de map() conserva esos nombres. map_dbl() y las demás variantes tipadas también conservan los nombres, lo que hace que los resultados sean 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)Uso de map() con columnas de data frames
Un data frame es una lista de columnas. map(df, fn) aplica fn a cada columna. Combinado con map_dbl(), ofrece una forma concisa de calcular una estadística para todas las columnas a la 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)Anidación de llamadas a map()
Puede anidar llamadas a map() para realizar iteraciones de varios niveles: un map externo sobre los grupos y otro interno sobre los parámetros. Esto reemplaza los bucles for anidados por una estructura limpia y componible. Para facilitar la lectura, limite la profundidad de anidación a 2 niveles.
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))
})Comprobación rápida
¿Cuál es la diferencia principal entre map() y map_dbl()?
Recapitulación: map() y variantes tipadas
Conceptos clave de map() y sus variantes tipadas:
map(.x, .f)— siempre devuelve una lista; es la opción más flexiblemap_dbl()— devuelve un vector numérico; genera un error si el tipo es incorrectomap_chr()— devuelve un vector de caracteresmap_lgl()— devuelve un vector lógicomap_int()— devuelve un vector de enterosmap_df()/map_dfr()— combina los resultados por filas en un data frame~.x— sintaxis abreviada para funciones anónimas- Las entradas con nombres producen automáticamente salidas con nombres
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')Preguntas frecuentes
¿La lección «map() y variantes tipadas» es gratis?
Sí — el texto completo de «map() y variantes tipadas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.
¿Qué aprenderé en «map() y variantes tipadas»?
Aplique funciones sobre listas con map(), map_dbl(), map_chr() y map_lgl(). Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar R Academy?
No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «map() y variantes tipadas»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de R Academy?
Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- map() y variantes tipadas
- map2() y pmap() para varias entradas
- reduce(), accumulate() y walk()
- keep(), discard() y filtrado de listas