Membuat Generik
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 27 dari 57.
Generic S4 dibuat dengan setGeneric(). Isi fungsinya adalah standardGeneric("name"), padanan S4 dari UseMethod(). setGeneric() mengembalikan nama generic, yang dicetak saat dipanggil pada level teratas:
setGeneric("area", function(shape) standardGeneric("area"))Output:
[1] "area"Bungkus pemanggilan dengan invisible() agar baris itu tidak muncul di output. setMethod("area", "Circle", ...) lalu menambahkan method untuk satu class:
setClass("Circle", slots = c(r = "numeric"))
setClass("Square", slots = c(side = "numeric"))
invisible(setGeneric("area", function(shape) standardGeneric("area")))
setMethod("area", "Circle", function(shape) pi * shape@r^2)
setMethod("area", "Square", function(shape) shape@side^2)
cat(area(new("Circle", r = 1)), area(new("Square", side = 3)))Output:
3.141593 9Sebuah method memiliki argumen yang sama dengan generic-nya. Saat generic memiliki ..., sebuah method dapat menambahkan argumen bernama miliknya sendiri setelahnya:
setClass("Circle", slots = c(r = "numeric"))
invisible(setGeneric("describe", function(x, ...) standardGeneric("describe")))
setMethod("describe", "Circle", function(x, ..., digits = 2) {
paste("circle of area", round(pi * x@r^2, digits))
})
c1 <- new("Circle", r = 2)
print(describe(c1))
print(describe(c1, digits = 4))Output:
[1] "circle of area 12.57"
[1] "circle of area 12.5664"setMethod() memerlukan generic sudah ada, jadi file yang berisi setGeneric() dimuat terlebih dahulu. Pemanggilan untuk class tanpa method akan berhenti dengan error yang menyebutkan signature:
invisible(setGeneric("area", function(shape) standardGeneric("area")))
setClass("Circle", slots = c(r = "numeric"))
setMethod("area", "Circle", function(shape) pi * shape@r^2)
area(42)Output:
Error: unable to find an inherited method for function ‘area’ for signature ‘shape = "numeric"’
Execution haltedTantangan
MudahBentuk adalah class S4 dalam tiga file. Di Shape.R, buat fungsi generik area(shape) dan perimeter(shape) dengan setGeneric(), lalu bungkus dengan invisible(). Di Circle.R dan Square.R, class dideklarasikan; tambahkan method area dan perimeter untuk masing-masing dengan setMethod().
Kode yang disediakan membaca baris circle 2 atau square 3 dan mencetak circle: area 12.57, perimeter 12.57.
Kodemu ditulis di Shape.R, Circle.R, dan Square.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
source("Shape.R")
source("Circle.R")
source("Square.R")
# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
s <- if (p[1] == "circle") new("Circle", r = as.numeric(p[2])) else new("Square", side = as.numeric(p[2]))
cat(sprintf("%s: area %.2f, perimeter %.2f", p[1], area(s), perimeter(s)), "\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