Dispatch Berdasarkan Dua Argumen
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 29 dari 57.
Generik S4 dapat memilih method berdasarkan class dari beberapa argumen. Signature mencantumkan satu class untuk setiap argumen, sehingga setiap pasangan class dapat memiliki method sendiri:
setClass("Asteroid", slots = c(size = "numeric"))
setClass("Ship", slots = c(name = "character"))
invisible(setGeneric("collide", function(a, b) standardGeneric("collide")))
setMethod("collide", signature("Asteroid", "Ship"), function(a, b) paste(b@name, "is hit"))
setMethod("collide", signature("Ship", "Ship"), function(a, b) "two ships bump")
rock <- new("Asteroid", size = 3)
enterprise <- new("Ship", name = "Enterprise")
print(collide(rock, enterprise))
print(collide(enterprise, enterprise))Output:
[1] "Enterprise is hit"
[1] "two ships bump"Class "ANY" cocok dengan setiap class. Method untuk signature("ANY", "ANY") adalah fallback yang dijalankan saat tidak ada pasangan yang lebih spesifik cocok:
setClass("Ship", slots = c(name = "character"))
invisible(setGeneric("collide", function(a, b) standardGeneric("collide")))
setMethod("collide", signature("Ship", "Ship"), function(a, b) "two ships bump")
setMethod("collide", signature("ANY", "ANY"), function(a, b) "nothing happens")
s <- new("Ship", name = "A")
cat(collide(s, s), "/", collide(s, 42), "/", collide("x", "y"))Output:
two ships bump / nothing happens / nothing happensUrutan argumen itu penting: signature("A", "B") dan signature("B", "A") adalah method yang berbeda. class dasar seperti numeric dan character juga dapat muncul dalam signature:
invisible(setGeneric("join", function(x, y) standardGeneric("join")))
setMethod("join", signature("character", "numeric"), function(x, y) paste(x, "number", y))
setMethod("join", signature("numeric", "character"), function(x, y) paste(y, "after number", x))
print(join("item", 3))
print(join(3, "item"))Output:
[1] "item number 3"
[1] "item after number 3"Class "missing" dalam signature cocok dengan argumen yang sama sekali tidak diberikan, sehingga satu generic dapat menyediakan bentuk singkat dan panjang:
invisible(setGeneric("greet", function(name, greeting) standardGeneric("greet")))
setMethod("greet", signature("character", "missing"), function(name, greeting) paste("Hello,", name))
setMethod("greet", signature("character", "character"), function(name, greeting) paste0(greeting, ", ", name))
print(greet("Ada"))
print(greet("Ada", "Good morning"))Output:
[1] "Hello, Ada"
[1] "Good morning, Ada"Tantangan
MudahBiaya pengiriman bergantung pada item dan zona. Class dideklarasikan di Item.R (Letter, Box, masing-masing dengan slot kg) dan Zone.R (Domestic, Abroad, masing-masing dengan slot name). Di Rates.R, buat generic shipping(item, zone) dan satu method untuk setiap pasangan:
Letterdi dalam negeri: 1; luar negeri: 3.Boxdi dalam negeri: 5 ditambah 2 per kg; luar negeri: 12 ditambah 4 per kg.- Pasangan lainnya: hentikan dengan
no rate for this item and zone(gunakancall. = FALSE).
Kode yang disediakan membaca baris box home 2.5 (item, zona, kg), dengan kata-kata yang tidak dikenal tetap berupa teks biasa, lalu mencetak box to home: 10.00 atau error: dan pesannya.
Kodemu ditulis di Item.R, Zone.R, dan Rates.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
source("Item.R")
source("Zone.R")
source("Rates.R")
# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
kg <- as.numeric(p[3])
item <- switch(p[1], letter = new("Letter", kg = kg), box = new("Box", kg = kg), kg)
zone <- switch(p[2], home = new("Domestic", name = "home"), abroad = new("Abroad", name = "abroad"), p[2])
out <- tryCatch(sprintf("%s to %s: %.2f", p[1], p[2], shipping(item, zone)),
error = function(e) paste("error:", conditionMessage(e)))
cat(out, "\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 Buku3Pewarisan S3
Vektor classUrutan Pencarian methodMemperluas dengan NextMethodMemeriksa dengan inherits()Ulasan: Penggajian Staf6S4 Generik dan method
Membuat Generikmethod untuk Fitur BawaanDispatch Berdasarkan Dua ArgumensetValidity dan validObjectRangkuman: Uang dan Mata UangLatihan sendiri: Compiler R online