Menu
Coddy logo textTech

Funktionen übergeben

Teil des Abschnitts Logik und Ablaufsteuerung der R-Journey von Coddy. Lektion 28 von 64.

Eine Funktion kann eine andere Funktion als Argument übernehmen und sie aufrufen. apply_twice() unten funktioniert mit jeder Funktion mit einem Argument:

apply_twice <- function(f, x) f(f(x))
print(apply_twice(\(x) x + 3, 10))
print(apply_twice(toupper, "ok"))

Ausgabe:

[1] 16
[1] "OK"

Eingebaute Funktionen wie sum, max oder toupper sind ebenfalls Werte. Übergebe sie daher ohne Klammern über ihren Namen. Mit Klammern würden sie stattdessen aufgerufen:

summarize <- function(xs, how) how(xs)
print(summarize(c(4, 9, 2), max))
print(summarize(c(4, 9, 2), sum))

Ausgabe:

[1] 9
[1] 15

Eine Funktion, die ein Prädikat entgegennimmt, also eine Funktion, die TRUE oder FALSE zurückgibt, kann Werte nach beliebigen Regeln zählen oder auswählen:

count_if <- function(xs, keep) {
  n <- 0
  for (x in xs) if (keep(x)) n <- n + 1
  n
}
print(count_if(c(3, 8, 10, 5), \(x) x %% 2 == 0))
print(count_if(c(3, 8, 10, 5), \(x) x > 4))

Ausgabe:

[1] 2
[1] 3

Der Aufrufer legt das Verhalten fest, und die Funktion stellt die Schleife bereit, sodass eine Funktion viele Fälle abdeckt:

transform_each <- function(xs, f) {
  out <- c()
  for (x in xs) out <- c(out, f(x))
  out
}
print(transform_each(1:4, \(x) x * 10))
print(transform_each(c("a", "b"), toupper))

Ausgabe:

[1] 10 20 30 40
[1] "A" "B"
challenge icon

Aufgabe

Einfach

Vervollständige apply_n(f, x, n). Rufe f insgesamt n-mal zuerst mit x und anschließend mit dem Ergebnis auf und gib den endgültigen Wert zurück. Wenn n 0 ist, gib x unverändert zurück.

Der bereitgestellte Code definiert drei Funktionen: double, inc und half. Er liest den Namen einer dieser Funktionen, den Startwert und n ein und gibt das Ergebnis von apply_n() aus.

Probier es selbst

apply_n <- function(f, x, n) {
  # Schreibe deinen Code hier
  x
}

# Mitgelieferter Ein-/Ausgabe-Code: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
ops <- list(double = \(x) x * 2, inc = \(x) x + 1, half = \(x) x / 2)
cat(apply_n(ops[[input[1]]], as.numeric(input[2]), as.numeric(input[3])), 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