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] 15Eine 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] 3Der 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"Aufgabe
EinfachVervollstä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")
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