Pola Iterator
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 49 dari 57.
Sebuah iterator memberikan item-item dari koleksi satu per satu, sehingga kode yang menggunakannya tidak perlu mengetahui cara koleksi tersebut disimpan. Closure menyimpan posisinya; has_next() dan next_value() adalah seluruh antarmukanya:
make_iterator <- function(x) {
i <- 0
list(
has_next = function() i < length(x),
next_value = function() {
i <<- i + 1
x[[i]]
}
)
}
it <- make_iterator(c("a", "b", "c"))
while (it$has_next()) cat(it$next_value(), "")Output:
a b c generator adalah iterator yang menghitung setiap nilai saat diminta, sehingga urutannya tidak perlu ada di memori. Urutannya bahkan bisa tidak berujung:
make_fib <- function() {
a <- 0
b <- 1
list(has_next = function() TRUE,
next_value = function() {
value <- a
nxt <- a + b
a <<- b
b <<- nxt
value
})
}
fib <- make_fib()
for (i in 1:10) cat(fib$next_value(), "")Output:
0 1 1 2 3 5 8 13 21 34 Iterator menyembunyikan tata letaknya. Hasil yang disimpan dalam halaman, beberapa di antaranya kosong, keluar sebagai satu urutan datar:
make_paged <- function(pages) {
p <- 1
i <- 0
skip_empty <- function() while (p <= length(pages) && i >= length(pages[[p]])) { p <<- p + 1; i <<- 0 }
list(
has_next = function() { skip_empty(); p <= length(pages) },
next_value = function() { skip_empty(); i <<- i + 1; pages[[p]][i] }
)
}
it <- make_paged(list(c("a", "b"), character(0), c("c")))
while (it$has_next()) cat(it$next_value(), "")Output:
a b c Fungsi pembantu yang dibuat berdasarkan antarmuka dapat digunakan dengan setiap iterator. take(it, n) mengambil hingga n nilai dari vector, generator, atau apa pun yang memiliki has_next() dan next_value():
make_iterator <- function(x) {
i <- 0
list(has_next = function() i < length(x), next_value = function() { i <<- i + 1; x[[i]] })
}
take <- function(it, n) {
out <- c()
while (length(out) < n && it$has_next()) out <- c(out, it$next_value())
out
}
it <- make_iterator(1:5)
print(take(it, 2))
print(take(it, 10))Keluaran:
[1] 1 2
[1] 3 4 5Tantangan
MudahLengkapi Iterator.R:
make_iterator(x): iterator untuk elemen-elemen sebuah vektor, denganhas_next()dannext_value();make_range(from, to, by): generator yang menghasilkanfrom,from + by, ... hingga dan termasukto, satu per satu;take(it, n): hinggannilai berikutnya dari iterator apa pun.
Kode yang disediakan membaca baris range 1 10 3 take 2 5 (from, to, by, lalu ukuran setiap take) atau list a,b,c take 2 2, lalu mencetak hasil setiap take().
Letakkan kodemu di Iterator.R. main.R berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
source("Iterator.R")
# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
it <- if (p[1] == "range") make_range(as.numeric(p[2]), as.numeric(p[3]), as.numeric(p[4])) else make_iterator(strsplit(p[2], ",")[[1]])
k <- if (p[1] == "range") 5 else 3
for (n in as.numeric(p[-(1:k)])) {
got <- take(it, n)
cat("take ", n, ": ", if (length(got) == 0) "(nothing)" else paste(got, collapse = " "), "\n", sep = "")
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar S3
Bekerja dengan fileList dengan classFungsi KonstruktorMethod print dan formatValidator dan helperUlasan: Suhu4Enkapsulasi di R
Closure sebagai objectEnvironment sebagai objectFungsi accessorMelindungi stateRangkuman: Meter Parkir2S3 Generics dan Method
Generics dan UseMethodMethod DefaultMethod untuk Base GenericsDasar-Dasar NextMethodRekap: Luas Bangun5S4 class
Mendefinisikan class S4Slots dan AksesPemeriksaan ValiditasMethod showRingkasan: Katalog Produk8Kelas Referensi
Mendefinisikan Kelas ReferensiPembaruan method dan fieldSemantik PenyalinanPewarisan dan callSuperRangkuman: Antrean Tugas11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam BukuLatihan sendiri: Compiler R online