Slots dan Akses
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 23 dari 57.
obj@slot <- value mengubah sebuah slot. Seperti object S3, object S4 adalah nilai: fungsi yang mengubahnya bekerja pada salinannya sendiri dan mengembalikannya:
setClass("Person", slots = c(name = "character", age = "numeric"))
birthday <- function(p) {
p@age <- p@age + 1
p
}
ada <- new("Person", name = "Ada", age = 36)
older <- birthday(ada)
cat(ada@age, older@age)Output:
36 37slot(obj, "name") melakukan hal yang sama seperti @ dengan nama slot dalam string, sehingga fungsi ini bisa digunakan dengan nama yang disimpan dalam variabel. slotNames() mencantumkan slot milik class atau object:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
for (s in slotNames(ada)) cat(s, "=", format(slot(ada, s)), "\n")
slot(ada, "age") <- 37
print(ada@age)Output:
name = Ada
age = 36
[1] 37Setiap penugasan diperiksa berdasarkan tipe yang dideklarasikan, tidak hanya new(). Nilai yang salah akan ditolak dan object akan mempertahankan nilai sebelumnya:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
ada@age <- "old"Output:
Error in (function (cl, name, valueClass) :
assignment of an object of class “character” is not valid for @‘age’ in an object of class “Person”; is(value, "numeric") is not TRUE
Execution haltedgetSlots() mengembalikan setiap nama slot beserta tipe yang dideklarasikan, sehingga kode dapat mengonversi input teks ke tipe yang diharapkan oleh slot:
setClass("Person", slots = c(name = "character", age = "numeric"))
types <- getSlots("Person")
print(types)
value <- "40"
if (types[["age"]] == "numeric") value <- as.numeric(value)
print(value + 1)Output:
name age
"character" "numeric"
[1] 41Tantangan
Mudahclass Profile di Profile.R memiliki slot name dan city (character), serta age (numeric). Lengkapi dua fungsi berikut:
update_profile(p, field, value)akan berhenti denganno field email(gunakancall. = FALSE) jika field tersebut bukan slot; jika tidak, fungsi ini mengonversi teksvaluedenganas.numeric()jika slotnya bertipe numeric, mengatur slot denganslot(), lalu mengembalikan profile yang telah diubah.profile_lines(p)mengembalikan satu baris untuk setiap slot, sesuai urutan slot:name: Ada.
Kode yang disediakan membaca nama, lalu baris seperti city=Paris atau age=36, menerapkan setiap baris, lalu mencetak baris-baris profile.
Tulis kodemu di Profile.R. main.R berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
source("Profile.R")
# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
p <- new("Profile", name = input[1], city = "unknown", age = 0)
for (line in input[-1]) {
kv <- strsplit(line, "=")[[1]]
p <- tryCatch(update_profile(p, kv[1], kv[2]), error = function(e) {
cat("error: ", conditionMessage(e), "\n", sep = "")
p
})
}
for (l in profile_lines(p)) cat(l, "\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