Zwracanie funkcji
Część sekcji Logika i przepływ sterowania ścieżki R w Coddy. Lekcja 29 z 64.
Funkcja może również zwracać funkcję. make_multiplier(3) zwraca nową funkcję, która mnoży swój argument przez 3:
make_multiplier <- function(n) {
function(x) x * n
}
triple <- make_multiplier(3)
print(triple(5))
print(make_multiplier(10)(5))Wynik:
[1] 15
[1] 50Zwrócona funkcja zapamiętuje wartości, z którymi została utworzona. Takie połączenie funkcji i otaczających ją zmiennych nazywa się domknięciem. Każde wywołanie funkcji tworzącej buduje osobne domknięcie:
make_greeter <- function(greeting) {
function(name) paste0(greeting, ", ", name, "!")
}
hello <- make_greeter("Hello")
hola <- make_greeter("Hola")
print(hello("Ada"))
print(hola("Ada"))Wynik:
[1] "Hello, Ada!"
[1] "Hola, Ada!"Funkcja tworząca zamienia kilka ustawień w gotowe narzędzie, na przykład konwerter jednostek:
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))Wynik:
[1] 212
[1] 6.21Funkcje można łączyć, tworząc nowe funkcje. compose(f, g) zwraca funkcję, która najpierw uruchamia f, a potem g:
compose <- function(f, g) function(x) g(f(x))
clean <- compose(trimws, toupper)
print(clean(" hi there "))Wynik:
[1] "HI THERE"Wyzwanie
ŁatwyUzupełnij make_formatter(prefix, digits). Zwraca ona funkcję, która przyjmuje liczbę i zwraca prefix, po którym następuje liczba z digits miejscami po przecinku: make_formatter("$", 2)(3.5) zwraca $3.50.
sprintf("%.*f", digits, x) formatuje x, podając digits miejsc po przecinku.
Dostarczony kod odczytuje prefiks, liczbę miejsc po przecinku oraz listę liczb oddzielonych przecinkami. Tworzy jeden formater i wypisuje jego wynik dla każdej liczby.
Spróbuj swoich sił
make_formatter <- function(prefix, digits) {
# Wpisz tutaj swój kod
function(x) ""
}
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 = "")
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