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] 50Fungsi 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.21Beberapa 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"Tantangan
MudahLengkapi 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 = "")
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Mendalami string
Substring dengan substr()Memformat dengan sprintf()Memisahkan dan MenggabungkanMencari stringMengganti TeksRangkuman: Pembuat Nama Pengguna4Matriks
Membuat MatriksMengakses Elemen MatriksRingkasan Baris dan KolomAritmetika MatriksRangkuman: Denah Tempat Duduk2Pencarian Nilai-Kunci
Pencarian pada Vector BernamaMemeriksa KunciMenambahkan dan Menghapus KunciMenelusuri NamaUlasan: Meja Saham5Proyek, Buku Nilai
Menambahkan SiswaMencatat Nilai3Set dan Penghitungan
Nilai UnikOperasi setPengujian KeanggotaanMenghitung dengan table()Ulasan: Tamu Acara6Fungsi sebagai Nilai
Fungsi AnonimMengirim FungsiMengembalikan FungsiClosure dengan StateRangkuman: Aturan Diskon9Data Frame
Membuat Data FrameKolom dan BarisMemfilter BarisMenambahkan dan MengurutkanRangkuman: Laporan Penjualan12Proyek: Pelacak Pengeluaran
Mencatat PengeluaranTotal PengeluaranLatihan sendiri: Compiler R online