Map und mapply
Teil des Abschnitts Logik und Ablaufsteuerung der R-Journey von Coddy. Lektion 33 von 64.
Map(f, xs, ys) durchläuft zwei oder mehr Vektoren schrittweise und ruft f mit jeweils einem Element aus jedem Vektor auf: zuerst mit den ersten Elementen, dann mit den zweiten Elementen und so weiter. Es gibt eine Liste zurück:
totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])Ausgabe:
[1] 3
[1] 7.5mapply() ist die vereinfachende Variante, ähnlich wie sapply() für mehrere Vektoren. unlist() wandelt außerdem die Liste von Map() in einen Vektor um:
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)))Ausgabe:
[1] 8.0 12.0 7.5
[1] 5 7 9Die Vektoren werden nach Position abgeglichen, daher müssen sie die gleiche Länge haben. mapply() benennt Textergebnisse nach dem ersten Vektor; USE.NAMES = FALSE entfernt die Namen:
items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)Ausgabe:
[1] "2 x tea" "3 x jam"Wenn jedes Paar ein if benötigt, schreibe eine Funktion mit mehreren Argumenten und übergib sie an mapply(). Die Bedingung wird dann einmal pro Paar ausgeführt:
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))Ausgabe:
[1] "Ada (adult)" "Tim (minor)"Aufgabe
EinfachVervollständige order_lines(items, qty, prices). Gib für jeden Artikel eine Zeile zurück, 2 x tea = 8.00: die Menge, x , den Artikel, = und das Produkt aus Menge und Preis mit zwei Dezimalstellen. Verwende mapply() oder Map().
Der bereitgestellte Code liest die Artikel, die Mengen und die Preise als drei durch Kommas getrennte Zeilen ein und gibt jede zurückgegebene Zeile aus.
Probier es selbst
order_lines <- function(items, qty, prices) {
# Schreibe deinen Code hier
character(0)
}
# Mitgelieferter Ein-/Ausgabecode: belasse ihn wie er ist
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")
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik und Ablaufsteuerung
1Strings im Detail
Teilstrings mit substr()Formatierung mit sprintf()Aufteilen und VerbindenStrings durchsuchenText ersetzenWiederholung – Benutzernamen-Generator4Matrizen
Matrizen erstellenMatrizen indizierenZusammenfassungen von Zeilen und SpaltenMatrizenarithmetikRückblick – Sitzplan10Fortgeschrittener Kontrollfluss
Die switch()-FunktionVektorisierter ifelse()repeat und breakRekursive FunktionenRückblick – Notenklassifizierung2Schlüssel-Wert-Suchen
Benannte Vektor-SuchenSchlüssel prüfenSchlüssel hinzufügen und entfernenNamen durchlaufenRückblick – Aktienübersicht5Projekt – Notenbuch
Schüler hinzufügenNoten eintragen3Mengen und Zählen
Eindeutige WerteMengenoperationenZugehörigkeitstestsZählen mit table()Rückblick – Gäste einer Veranstaltung6Funktionen als Werte
Anonyme FunktionenFunktionen übergebenFunktionen zurückgebenClosures mit ZustandRückblick – Rabattregeln9Datenrahmen
Datenrahmen erstellenSpalten und ZeilenZeilen filternHinzufügen und SortierenZusammenfassung – Verkaufsbericht12Projekt – Ausgaben-Tracker
Ausgaben erfassenGesamtausgabenÜbe selbstständig: Online-R-Compiler