Menu
CoddyTech

Mengembalikan Fungsi

Termasuk bagian Logika dan Alur dalam perjalanan R di Coddy. Pelajaran 29 dari 64.

Fungsi juga dapat mengembalikan fungsi. make_multiplier(3) mengembalikan fungsi baru yang mengalikan argumennya dengan 3:

make_multiplier <- function(n) {
  function(x) x * n
}
triple <- make_multiplier(3)
print(triple(5))
print(make_multiplier(10)(5))

Output:

[1] 15
[1] 50

Fungsi yang dikembalikan mengingat nilai yang digunakan untuk membuatnya. Kombinasi fungsi dan variabel di sekitarnya ini disebut closure. Setiap pemanggilan fungsi pembuat menghasilkan closure terpisah:

make_greeter <- function(greeting) {
  function(name) paste0(greeting, ", ", name, "!")
}
hello <- make_greeter("Hello")
hola <- make_greeter("Hola")
print(hello("Ada"))
print(hola("Ada"))

Output:

[1] "Hello, Ada!"
[1] "Hola, Ada!"

Fungsi pembuat mengubah beberapa pengaturan menjadi alat siap pakai, misalnya konverter antarunit:

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))

Output:

[1] 212
[1] 6.21

Beberapa fungsi dapat digabungkan menjadi fungsi baru. compose(f, g) mengembalikan fungsi yang menjalankan f lalu g:

compose <- function(f, g) function(x) g(f(x))
clean <- compose(trimws, toupper)
print(clean("  hi there "))

Output:

[1] "HI THERE"
challenge icon

Tantangan

Mudah

Lengkapi make_formatter(prefix, digits). Fungsi ini mengembalikan fungsi yang menerima angka dan mengembalikan prefix diikuti angka dengan digits angka desimal: make_formatter("$", 2)(3.5) mengembalikan $3.50.

sprintf("%.*f", digits, x) memformat x dengan digits angka desimal.

Kode yang disediakan membaca prefix, jumlah angka desimal, dan daftar angka yang dipisahkan koma. Kode ini membuat satu pemformat dan mencetak hasilnya untuk setiap angka.

Coba sendiri

make_formatter <- function(prefix, digits) {
  # Tulis kodemu di sini
  function(x) ""
}

# Kode input/output yang disediakan: biarkan apa adanya
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler R online