Menu
CoddyTech

Mendefinisikan class S4

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 22 dari 57.

S4 adalah sistem object formal milik R. setClass() mendeklarasikan class dengan slot bernama dan tipe masing-masing, lalu new() membuat object. Operator @ membaca slot:

setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)

Output:

Ada is 36

setClass() juga mengembalikan fungsi generator. Tetapkan fungsi itu ke sebuah nama, biasanya nama class, lalu panggil seperti constructor:

Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))

Output:

[1] 8
[1] TRUE

Berbeda dengan S3, R memeriksa slot. Slot yang tidak dikenal atau nilai dengan tipe yang salah akan membuat new() berhenti dengan error, jadi object S4 selalu memiliki bentuk yang dideklarasikan oleh class-nya:

setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")

Output:

Error in validObject(.Object) : 
  invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution halted

Slot yang tidak diberi nilai akan mendapatkan nilai kosong sesuai tipenya, seperti character(0). prototype menetapkan nilai default yang sebenarnya. Kode lama mendeklarasikan slot dengan representation(), yang artinya sama dengan slots:

setClass("Task", slots = c(title = "character", done = "logical"),
         prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))

Output:

[1] FALSE
[1] 0
challenge icon

Tantangan

Mudah

Deklarasikan class S4 Book di Book.R dengan tiga slot: title dan author bertipe character, serta pages bertipe numeric. Lalu lengkapi book_label(b), yang membaca slot menggunakan @ dan mengembalikan Dune by Frank Herbert (412 pages).

Kode yang disediakan membaca baris title;author;pages, membuat setiap buku dengan new("Book", ...), mencetak labelnya, lalu mencetak nama slot class.

Tuliskan 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 tetap seperti ini
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  p <- strsplit(line, ";")[[1]]
  b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
  cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), collapse = ", "), "\n", sep = "")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler R online