Reduce
Teil des Abschnitts Logik und Ablaufsteuerung der R-Journey von Coddy. Lektion 35 von 64.
Reduce(f, x) kombiniert die Elemente von x zu einem Wert: Es ruft f für die ersten beiden Elemente auf, dann für dieses Ergebnis und das dritte Element und so weiter. Mit + addiert es alles:
print(Reduce(function(acc, x) acc + x, c(3, 5, 10)))
print(Reduce(`+`, 1:5))Ausgabe:
[1] 18
[1] 15Operatoren wie + sind ebenfalls Funktionen. In Backticks geschrieben, kann `+` wie jede andere Funktion übergeben werden. Reduce() ist besonders nützlich, wenn es keine integrierte Funktion für die Kombination gibt, etwa um das längere von zwei Wörtern beizubehalten:
longer <- function(a, b) if (nchar(b) > nchar(a)) b else a
print(Reduce(longer, c("fig", "banana", "kiwi", "cherry")))Ausgabe:
[1] "banana"Das dritte Argument, init, ist der Startwert. Es wird als erstes acc verwendet und ist außerdem das Ergebnis, wenn x leer ist:
print(Reduce(`+`, c(), 0))
print(Reduce(function(acc, w) paste0(acc, toupper(substr(w, 1, 1))), c("portable", "network", "graphics"), ""))Ausgabe:
[1] 0
[1] "PNG"accumulate = TRUE gibt jedes Zwischenergebnis statt nur des letzten zurück, wodurch laufende Summen entstehen:
deposits <- c(100, -30, 50, -80)
print(Reduce(`+`, deposits, accumulate = TRUE))Ausgabe:
[1] 100 70 120 40Aufgabe
EinfachVervollständige running_balance(start, changes). Beginne mit start und wende jede Änderung der Reihe nach an. Gib eine Zeile pro Änderung mit dem Kontostand danach zurück, after 1: 70, sowie eine letzte Zeile lowest: , gefolgt vom niedrigsten erreichten Kontostand (einschließlich start).
Der bereitgestellte Code liest den Anfangskontostand und die Änderungen als durch Kommas getrennte Zeile ein und gibt jede zurückgegebene Zeile aus.
Probier es selbst
running_balance <- function(start, changes) {
# Schreibe deinen Code hier
character(0)
}
# Bereitgestellter Ein-/Ausgabecode: belasse ihn unverändert
input <- suppressWarnings(readLines(file("stdin")))
cat(running_balance(as.numeric(input[1]), as.numeric(strsplit(input[2], ",")[[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