Menu
CoddyTech

Funktionen zurückgeben

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

Eine Funktion kann auch eine Funktion zurückgeben. make_multiplier(3) gibt eine neue Funktion zurück, die ihr Argument mit 3 multipliziert:

make_multiplier <- function(n) {
  function(x) x * n
}
triple <- make_multiplier(3)
print(triple(5))
print(make_multiplier(10)(5))

Ausgabe:

[1] 15
[1] 50

Die zurückgegebene Funktion merkt sich die Werte, mit denen sie erstellt wurde. Diese Kombination aus einer Funktion und den Variablen um sie herum nennt man Closure. Jeder Aufruf der Erzeugerfunktion erstellt eine separate Closure:

make_greeter <- function(greeting) {
  function(name) paste0(greeting, ", ", name, "!")
}
hello <- make_greeter("Hello")
hola <- make_greeter("Hola")
print(hello("Ada"))
print(hola("Ada"))

Ausgabe:

[1] "Hello, Ada!"
[1] "Hola, Ada!"

Eine Erzeugerfunktion verwandelt einige Einstellungen in ein fertiges Werkzeug, zum Beispiel einen Einheitenumrechner:

make_converter <- function(factor, offset = 0) {
  function(x) x * factor + offset
}
c_to_f <- make_converter(1.8, 32)
km_to_miles <- make_converter(0.621)
print(c_to_f(100))
print(km_to_miles(10))

Ausgabe:

[1] 212
[1] 6.21

Funktionen lassen sich zu neuen Funktionen kombinieren. compose(f, g) gibt eine Funktion zurück, die zuerst f und dann g ausführt:

compose <- function(f, g) function(x) g(f(x))
clean <- compose(trimws, toupper)
print(clean("  hi there "))

Ausgabe:

[1] "HI THERE"
challenge icon

Aufgabe

Einfach

Vervollständige make_formatter(prefix, digits). Die Funktion gibt eine Funktion zurück, die eine Zahl entgegennimmt und prefix gefolgt von der Zahl mit digits Nachkommastellen zurückgibt: make_formatter("$", 2)(3.5) gibt $3.50 zurück.

sprintf("%.*f", digits, x) formatiert x mit digits Nachkommastellen.

Der bereitgestellte Code liest das Präfix, die Anzahl der Nachkommastellen und eine durch Kommas getrennte Liste von Zahlen ein. Er erstellt einen Formatierer und gibt sein Ergebnis für jede Zahl aus.

Probier es selbst

make_formatter <- function(prefix, digits) {
  # Schreibe deinen Code hier
  function(x) ""
}

# Vorgegebener Eingabe-/Ausgabecode: Lass ihn unverändert
input <- suppressWarnings(readLines(file("stdin")))
fmt <- make_formatter(input[1], as.integer(input[2]))
for (x in as.numeric(strsplit(input[3], ",")[[1]])) cat(fmt(x), "\n", sep = "")
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