Menu
Coddy logo textTech

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] 50

Zwró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.21

Funkcje 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"
challenge icon

Wyzwanie

Łatwy

Uzupeł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 = "")
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator R online