0Pricing
R Academy · Lezione

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ù flessibile
  • map_dbl() — restituisce un vettore numerico; genera un errore se il tipo è errato
  • map_chr() — restituisce un vettore di caratteri
  • map_lgl() — restituisce un vettore logico
  • map_int() — restituisce un vettore di interi
  • map_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

  1. map() e varianti tipizzate
  2. map2() e pmap() per input multipli
  3. reduce(), accumulate() e walk()
  4. keep(), discard() e filtraggio delle liste
← Torna a R Academy