Przekazywanie funkcji
Część sekcji Logika i przepływ sterowania ścieżki R w Coddy. Lekcja 28 z 64.
Funkcja może przyjąć inną funkcję jako argument i ją wywołać. Poniższa funkcja apply_twice() działa z dowolną funkcją przyjmującą jeden argument:
apply_twice <- function(f, x) f(f(x))
print(apply_twice(\(x) x + 3, 10))
print(apply_twice(toupper, "ok"))Wynik:
[1] 16
[1] "OK"Wbudowane funkcje, takie jak sum, max lub toupper, również są wartościami, więc przekazuj je po nazwie, bez nawiasów. Z nawiasami zostałyby wywołane:
summarize <- function(xs, how) how(xs)
print(summarize(c(4, 9, 2), max))
print(summarize(c(4, 9, 2), sum))Wynik:
[1] 9
[1] 15Funkcja przyjmująca predykat, czyli funkcję zwracającą TRUE lub FALSE, może zliczać lub wybierać wartości według dowolnej reguły:
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))Wynik:
[1] 2
[1] 3Wywołujący określa zachowanie, a funkcja dostarcza pętlę, więc jedna funkcja obsługuje wiele przypadków:
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))Wynik:
[1] 10 20 30 40
[1] "A" "B"Wyzwanie
ŁatwyUzupełnij apply_n(f, x, n). Wywołaj f dla x, a następnie dla otrzymanego wyniku, łącznie n razy, i zwróć końcową wartość. Gdy n wynosi 0, zwróć x bez zmian.
Dostarczony kod definiuje trzy funkcje: double, inc i half. Odczytuje nazwę jednej z nich, wartość początkową i n, a następnie wyświetla wynik apply_n().
Spróbuj swoich sił
apply_n <- function(f, x, n) {
# Wpisz tutaj swój kod
x
}
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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")
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Łańcuchy znaków w szczegółach
Podciągi za pomocą substr()Formatowanie za pomocą sprintf()Dzielenie i łączenieWyszukiwanie w łańcuchach znakówZastępowanie tekstuPowtórka – kreator nazwy użytkownika4Macierze
Tworzenie macierzyIndeksowanie macierzyPodsumowania wierszy i kolumnDziałania na macierzachPowtórka – plan miejsc10Zaawansowane sterowanie przepływem
Funkcja switch()Wektorowe ifelse()repeat i breakFunkcje rekurencyjnePodsumowanie — klasyfikator ocen2Wyszukiwanie wartości po kluczach
Wyszukiwanie nazwanych elementów wektoraSprawdzanie kluczyDodawanie i usuwanie kluczyIterowanie po nazwachPowtórzenie — giełda5Projekt — dziennik ocen
Dodawanie uczniówZapisywanie ocen3Zbiory i zliczanie
Unikalne wartościOperacje na zbiorachTesty przynależnościZliczanie za pomocą table()Podsumowanie — goście wydarzenia6Funkcje jako wartości
Funkcje anonimowePrzekazywanie funkcjiZwracanie funkcjiDomknięcia ze stanemPowtórka — reguły rabatowe9Ramki danych
Tworzenie ramek danychKolumny i wierszeFiltrowanie wierszyDodawanie i sortowaniePodsumowanie – raport sprzedaży12Projekt – śledzenie wydatków
Rejestrowanie wydatkówŁączne wydatkiPoćwicz samodzielnie: Kompilator R online