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] 50Die zurückgegebene Funktion merkt sich die Werte, mit denen sie erstellt wurde. Diese Kombination aus einer Funktion und den Variablen in ihrer Umgebung wird als Closure bezeichnet. Jeder Aufruf des Erstellers 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.21Funktionen können zu neuen Funktionen kombiniert werden. 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"Aufgabe
EinfachVervollständige make_formatter(prefix, digits). Sie 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 Formatter und gibt dessen Ergebnis für jede Zahl aus.
Probier es selbst
make_formatter <- function(prefix, digits) {
# Schreibe deinen Code hier
function(x) ""
}
# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
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 = "")
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