Menu
CoddyTech

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 37

slot(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] 37

Setiap 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 halted

getSlots() 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] 41
challenge icon

Tantangan

Mudah

class Profile di Profile.R memiliki slot name dan city (character), serta age (numeric). Lengkapi dua fungsi berikut:

  • update_profile(p, field, value) akan berhenti dengan no field email (gunakan call. = FALSE) jika field tersebut bukan slot; jika tidak, fungsi ini mengonversi teks value dengan as.numeric() jika slotnya bertipe numeric, mengatur slot dengan slot(), 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 = "")
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