map() e varianti tipizzate
Applichi funzioni alle liste con map(), map_dbl(), map_chr() e map_lgl().
map() e varianti tipizzate è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento R Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso R Academy include 4 lezioni in totale.
Programmazione funzionale con purrr
Il pacchetto purrr fornisce strumenti coerenti e type-safe per la programmazione funzionale in R. Invece di scrivere cicli for, applica una funzione a una lista o a un vettore utilizzando map. Il risultato è un codice più pulito, più facile da comprendere e da comporre.
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() — Restituisce sempre una lista
map(.x, .f) applica la funzione .f a ogni elemento di .x e restituisce una list. L'input può essere una lista, un vettore o un data frame (in questo caso itera sulle colonne). Questa è la variante map più generale.
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() — Restituisce un vettore numerico
map_dbl(.x, .f) applica .f a .x e restituisce un numeric (double) vector. Se un risultato non è un singolo valore numerico, genera un errore: questo controllo del tipo consente di individuare tempestivamente gli errori.
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() — Restituisce un vettore di caratteri
map_chr(.x, .f) applica la funzione e restituisce un character vector. È utile per estrarre attributi testuali, formattare risultati o creare percorsi di file. La funzione deve restituire una singola stringa per ogni 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() — Restituisce un vettore logico
map_lgl(.x, .f) restituisce un logical vector di valori TRUE/FALSE. È perfetto per verificare condizioni su una lista, ad esempio per controllare quali elementi soddisfano 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() — Restituisce un vettore di interi
map_int(.x, .f) restituisce un integer vector. Lo utilizzi quando la funzione restituisce conteggi, indici o altri risultati espressi in numeri interi. Nota: in R, length() e nrow() restituiscono valori interi.
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() — Restituisce un Data Frame
map_df(.x, .f) (alias: map_dfr()) applica .f e concatena per righe i risultati in un unico data frame. La funzione deve restituire un data frame o un tibble per ogni elemento. map_dfc() concatena invece per colonne.
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
)
})Funzioni anonime con ~
purrr supporta una sintassi abbreviata basata sulle formule per le funzioni anonime: ~expr, dove .x fa riferimento all'elemento corrente. In questo modo non è necessario scrivere function(x) expr e il codice rimane conciso. I due stili sono equivalenti.
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)Iterare su una lista denominata
Quando .x è una lista o un vettore denominato, l'output di map() ne conserva i nomi. Anche map_dbl() e le altre varianti tipizzate mantengono i nomi, rendendo i risultati autoesplicativi.
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)Usare map() con le colonne di un data frame
Un data frame è una lista di colonne. map(df, fn) applica fn a ogni colonna. In combinazione con map_dbl(), offre un modo conciso per calcolare contemporaneamente una statistica per ogni colonna.
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)Annidare le chiamate a map()
È possibile annidare le chiamate a map() per eseguire iterazioni su più livelli: il map esterno scorre i gruppi, quello interno i parametri. Questo sostituisce i cicli for annidati con una struttura chiara e componibile. Per mantenere il codice leggibile, limiti la profondità dell'annidamento a 2 livelli.
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 rapida
Qual è la differenza principale tra map() e map_dbl()?
Riepilogo: map() e varianti tipizzate
Punti chiave su map() e sulle varianti tipizzate:
map(.x, .f)— restituisce sempre una lista; è la variante più flessibilemap_dbl()— restituisce un vettore numerico; genera un errore se il tipo è erratomap_chr()— restituisce un vettore di caratterimap_lgl()— restituisce un vettore logicomap_int()— restituisce un vettore di interimap_df()/map_dfr()— concatena i risultati per righe in un data frame- La sintassi abbreviata
~.x— consente di definire funzioni anonime in modo conciso - Gli input denominati producono automaticamente output denominati
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')Domande Frequenti
La lezione «map() e varianti tipizzate» è gratuita?
Sì — il testo completo di «map() e varianti tipizzate» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso R Academy, passa a CoddyKit PRO. Il corso R Academy include 4 lezioni in totale.
Cosa imparerò in «map() e varianti tipizzate»?
Applichi funzioni alle liste con map(), map_dbl(), map_chr() e map_lgl(). Eserciti R Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare R Academy?
Non è richiesta alcuna esperienza precedente. R Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «map() e varianti tipizzate»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione R Academy?
Sì. Ogni lezione R Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- map() e varianti tipizzate
- map2() e pmap() per input multipli
- reduce(), accumulate() e walk()
- keep(), discard() e filtraggio delle liste