Mendefinisikan Kelas Referensi
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 37 dari 57.
Class Referensi (RC) adalah sistem R untuk object yang berubah di tempat, seperti di Java atau Python. setRefClass() mendeklarasikan class dengan bidang bertipe dan mengembalikan generator; $new() membuat object, dan $ membaca serta mengubah bidangnya:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
a$balance <- a$balance + 50
cat(a$owner, a$balance)Output:
Ada 150Object RC adalah sebuah referensi, seperti environment. Menetapkannya ke variabel lain atau meneruskannya ke fungsi tidak akan menyalinnya, jadi perubahan melalui nama mana pun akan mengubah satu object yang sama:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
pay_fee <- function(acc) acc$balance <- acc$balance - 5
a <- Account$new(owner = "Ada", balance = 100)
b <- a
b$balance <- 60
pay_fee(a)
cat(a$balance, b$balance)Output:
55 55Field memiliki tipe. Penetapan nilai dengan class yang salah akan ditolak, dan field akan mempertahankan nilai lamanya:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
msg <- tryCatch({ a$balance <- "lots"; "changed" }, error = function(e) conditionMessage(e))
cat(msg, "\n")
cat(a$balance, "\n")Output:
invalid assignment for reference class field ‘balance’, should be from class “numeric” or a subclass (was class “character”)
100 Generator menjelaskan class: Account$fields() mencantumkan field dan tipe datanya. Object yang dicetak tanpa method show mencantumkan field-nya; field yang tidak diberi nilai akan kosong:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
print(Account$fields())
Account$new(owner = "Bo")Output:
owner balance
"character" "numeric"
Reference class object of class "Account"
Field "owner":
[1] "Bo"
Field "balance":
numeric(0)Tantangan
MudahDeklarasikan Reference Class Book di Book.R dengan field title dan author (character), serta pages (numeric), dan pertahankan generator di Book. Lalu tulis add_pages(book, n), yang menambahkan n ke jumlah halaman buku secara langsung dan tidak mengembalikan apa pun yang berguna.
Kode yang disediakan membaca title;author;pages, membuat buku, memberikannya ke variabel kedua, menambahkan angka-angka yang tersisa melalui nama kedua itu, lalu mencetak buku asli dan nama-nama field.
Tulis kodemu di Book.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
source("Book.R")
# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ";")[[1]]
b <- Book$new(title = p[1], author = p[2], pages = as.numeric(p[3]))
alias <- b
for (n in as.numeric(input[-1])) add_pages(alias, n)
cat(b$title, " by ", b$author, ": ", b$pages, " pages\n", sep = "")
cat("fields: ", paste(names(Book$fields()), 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