Menu
CoddyTech

Method untuk Base Generics

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

Banyak fungsi dalam base R adalah generic S3: print(), format(), summary(), toString(), length(), as.character() dan lainnya. Menambahkan method membuat class-mu bekerja dengan fungsi yang sudah dikenal oleh setiap pengguna R. summary.gradebook() melaporkan keseluruhan object:

summary.gradebook <- function(object, ...) {
  paste0(length(object$marks), " marks, average ", mean(object$marks))
}
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
cat(summary(g), "\n")

Output:

3 marks, average 82 

Periksa parameter generic sebelum menulis method: summary() menyebut argumen pertamanya object, sedangkan toString() dan format() menyebutnya x. toString() seharusnya mengembalikan satu string:

toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))

Output:

[1] "70 / 85 / 91"

Sebuah method length() mengubah arti length() untuk class tersebut. Queue yang menyimpan itemnya dalam sebuah field dapat melaporkan jumlah item yang disimpannya, bukan jumlah field dalam list:

q <- structure(list(items = c("a", "b", "c"), name = "jobs"), class = "queue")
print(length(q))
length.queue <- function(x) length(x$items)
print(length(q))

Output:

[1] 2
[1] 3

Operator juga merupakan generik. Method bernama "+.money", ditulis dengan tanda kutip karena simbol, dijalankan saat salah satu sisi + adalah object money. Method ini menerima kedua sisi sebagai e1 dan e2:

new_money <- function(amount) structure(list(amount = amount), class = "money")
"+.money" <- function(e1, e2) new_money(e1$amount + e2$amount)
"==.money" <- function(e1, e2) e1$amount == e2$amount
a <- new_money(5)
b <- new_money(7)
print((a + b)$amount)
print(a == b)

Output:

[1] 12
[1] FALSE
challenge icon

Tantangan

Mudah

Sebuah stack menyimpan itemnya di field items, dengan item teratas berada di posisi terakhir. new_stack(), push(), dan pop() di Stack.R sudah disediakan. Tambahkan tiga method:

  • length.stack() mengembalikan jumlah item.
  • toString.stack() mengembalikan item dari atas ke bawah yang digabung dengan | , atau empty.
  • summary.stack() mengembalikan stack of 3, top: c, atau stack of 0 jika stack kosong.

Kode yang disediakan membaca perintah push <item> dan pop, lalu mencetak panjangnya, toString(), dan summary().

Tulis kodemu di Stack.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

source("Stack.R")

# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
s <- new_stack()
for (cmd in input) {
  if (cmd == "pop") s <- pop(s) else s <- push(s, substring(cmd, 6))
}
cat("length: ", length(s), "\n", sep = "")
cat("items: ", toString(s), "\n", sep = "")
cat(summary(s), "\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