Map e mapply
Fa parte della sezione Logica e flusso del percorso R di Coddy. Lezione 33 di 64.
Map(f, xs, ys) scorre due o più vettori in parallelo e chiama f con un elemento di ciascuno: prima con i primi elementi, poi con i secondi elementi e così via. Restituisce una lista:
totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])Output:
[1] 3
[1] 7.5mapply() è la versione semplificata, come sapply() per più vettori. Anche unlist() appiattisce l'elenco restituito da Map() in un vettore:
print(mapply(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5)))
print(unlist(Map(function(a, b) a + b, 1:3, 4:6)))Output:
[1] 8.0 12.0 7.5
[1] 5 7 9I vettori vengono abbinati in base alla posizione, quindi devono avere la stessa lunghezza. mapply() assegna ai risultati testuali i nomi del primo vettore; USE.NAMES = FALSE rimuove i nomi:
items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)Output:
[1] "2 x tea" "3 x jam"Quando ogni coppia richiede un if, scrivi una funzione con diversi argomenti e passala a mapply(). La condizione viene quindi eseguita una volta per ogni coppia:
describe <- function(name, age) {
group <- if (age < 18) "minor" else "adult"
paste0(name, " (", group, ")")
}
print(mapply(describe, c("Ada", "Tim"), c(36, 12), USE.NAMES = FALSE))Output:
[1] "Ada (adult)" "Tim (minor)"Sfida
FacileCompleta order_lines(items, qty, prices). Restituisci una riga per ogni articolo, 2 x tea = 8.00: la quantità, x , l’articolo, = e la quantità moltiplicata per il prezzo con due cifre decimali. Usa mapply() o Map().
Il codice fornito legge gli articoli, le quantità e i prezzi da tre righe separate da virgole e stampa ogni riga restituita.
Provalo tu
order_lines <- function(items, qty, prices) {
# Scrivi il tuo codice qui
character(0)
}
# Codice di input/output fornito: lascialo così com'è
input <- suppressWarnings(readLines(file("stdin")))
cat(order_lines(strsplit(input[1], ",")[[1]], as.numeric(strsplit(input[2], ",")[[1]]), as.numeric(strsplit(input[3], ",")[[1]])), sep = "\n")
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Sottostringhe con substr()Formattazione con sprintf()Dividere e unireRicerca nelle stringheSostituzione del testoRipasso - Generatore di nomi utente4Matrici
Creazione di matriciIndicizzazione delle matriciRiepiloghi di righe e colonneOperazioni aritmetiche con le matriciRipasso - Schema dei posti a sedere10Flusso di controllo avanzato
La funzione switch()ifelse() vettorialerepeat e breakFunzioni ricorsiveRiepilogo - Classificatore di voti2Ricerche chiave-valore
Ricerche in vettori con nomiControllare le chiaviAggiungere e rimuovere chiaviIterare sui nomiRiepilogo - Sportello titoli5Progetto - Registro dei voti
Aggiungere studentiRegistrare i voti8Ordinamento e raggruppamento
Ordinare i vettoriOrdinare in base a una chiaveRaggruppare con split()Riepiloghi dei gruppiRipasso - Classifica3Insiemi e conteggio
Valori univociOperazioni sugli insiemiTest di appartenenzaConteggio con table()Riepilogo - Ospiti dell’evento6Le funzioni come valori
Funzioni anonimePassare funzioniRestituire funzioniClosure con statoRiepilogo - Regole di sconto9DataFrame
Creare DataFrameColonne e righeFiltrare le righeAggiungere e ordinareRiepilogo - Report delle vendite12Progetto - Gestione delle spese
Registrare le speseSpesa totaleEsercitati da solo: Compilatore R online