Closure dengan State
Termasuk bagian Logika dan Alur dalam perjalanan R di Coddy. Pelajaran 30 dari 64.
Di dalam fungsi, <- membuat variabel lokal. Operator <<- menetapkan nilai ke variabel dengan nama yang sama di fungsi yang mencakupnya, sehingga closure dapat memperbarui nilai yang ditangkapnya:
make_counter <- function() {
count <- 0
function() {
count <<- count + 1
count
}
}
next_id <- make_counter()
print(next_id())
print(next_id())
print(next_id())Output:
[1] 1
[1] 2
[1] 3Setiap counter yang dibuat oleh pembuatnya memiliki count sendiri, jadi keduanya tidak pernah saling mengganggu:
make_counter <- function() {
count <- 0
function() {
count <<- count + 1
count
}
}
a <- make_counter()
b <- make_counter()
for (i in 1:2) a()
print(a())
print(b())Output:
[1] 3
[1] 1Dengan <- biasa di dalam closure, pembaruan membuat variabel lokal baru yang menghilang setelah setiap pemanggilan, dan nilai yang tersimpan tidak pernah berubah:
make_broken <- function() {
count <- 0
function() {
count <- count + 1
count
}
}
f <- make_broken()
for (i in 1:2) f()
print(f())Output:
[1] 1Sebuah pembuat dapat mengembalikan list closure yang berbagi variabel yang sama. Bersama-sama, semuanya berperilaku seperti object kecil dengan datanya sendiri:
make_wallet <- function(balance) {
list(
add = function(x) balance <<- balance + x,
get = function() balance
)
}
w <- make_wallet(10)
w$add(5)
print(w$get())Output:
[1] 15Tantangan
MudahLengkapi make_counter(). Fungsi ini mengembalikan fungsi yang, setiap kali dipanggil, menambahkan 1 ke penghitungnya sendiri dan mengembalikan nilai hitungan yang baru, dimulai dari 1.
Kode yang disediakan membuat dua penghitung, a dan b. Kode ini membaca list a dan b yang dipisahkan koma, memanggil penghitung yang cocok untuk setiap entri, lalu mencetak setiap nilai yang dikembalikan pada barisnya sendiri.
Coba sendiri
make_counter <- function() {
# Tulis kodemu di sini
function() 0
}
# Kode input/output yang disediakan: biarkan tetap seperti ini
input <- suppressWarnings(readLines(file("stdin")))
counters <- list(a = make_counter(), b = make_counter())
for (k in strsplit(input[1], ",")[[1]]) cat(counters[[k]](), "\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