Menu
Coddy logo textTech

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] 15

Operatoren 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  40
challenge icon

Aufgabe

Einfach

Vervollstä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")
quiz iconTeste dich selbst

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

Übe selbstständig: Online-R-Compiler