Menu
CoddyTech

method untuk Fitur Bawaan

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

setMethod() juga menambahkan method S4 ke fungsi dasar seperti length() dan summary(). Fungsi dasar tetap berfungsi untuk hal lainnya, dan class-mu memiliki perilakunya sendiri:

setClass("Playlist", slots = c(name = "character", songs = "character"))
setMethod("length", "Playlist", function(x) length(x@songs))
pl <- new("Playlist", name = "gym", songs = c("a", "b", "c"))
print(length(pl))
print(length(c(1, 2)))

Output:

[1] 3
[1] 2

Operator juga merupakan generic. Sebuah method untuk + mencantumkan class pada kedua sisi dalam signature(). Kedua argumen disebut e1 dan e2:

setClass("Money", slots = c(amount = "numeric"))
setMethod("show", "Money", function(object) cat(sprintf("%.2f", object@amount), "\n"))
setMethod("+", signature("Money", "Money"), function(e1, e2) {
  new("Money", amount = e1@amount + e2@amount)
})
new("Money", amount = 2.5) + new("Money", amount = 4)

Output:

6.50 

generic grup Arith mewakili +, -, *, /, ^ dan operator lainnya sekaligus. Di dalam method-nya, callGeneric() mengulangi operator yang digunakan pada nilai yang kamu berikan:

setClass("Money", slots = c(amount = "numeric"))
setMethod("Arith", signature("Money", "numeric"), function(e1, e2) {
  new("Money", amount = callGeneric(e1@amount, e2))
})
m <- new("Money", amount = 10)
cat((m * 3)@amount, (m / 4)@amount, (m - 1)@amount)

Output:

30 2.5 9

Generic grup Compare mencakup ==, <, > dan operator lainnya. Method-nya mengembalikan nilai logika yang dikembalikan callGeneric() untuk slot-slot tersebut:

setClass("Money", slots = c(amount = "numeric"))
setMethod("Compare", signature("Money", "Money"), function(e1, e2) {
  callGeneric(e1@amount, e2@amount)
})
a <- new("Money", amount = 5)
b <- new("Money", amount = 8)
cat(a < b, a == b, a >= b)

Output:

TRUE FALSE FALSE
challenge icon

Tantangan

Mudah

Class Money di Money.R memiliki slot amount (numeric) dan currency (character). Tambahkan empat method:

  • show() mencetak 12.50 EUR dan baris baru;
  • + untuk dua object Money mengembalikan jumlahnya, atau berhenti dengan cannot add EUR and USD (gunakan call. = FALSE) jika mata uangnya berbeda;
  • * untuk Money dan sebuah angka mengembalikan nilai amount yang diskalakan;
  • == untuk dua object Money bernilai TRUE jika amount dan currency sama.

Kode yang disediakan membaca baris 10:EUR + 2.5:EUR, 4:USD * 3 atau 1:EUR == 1:EUR dan mencetak hasilnya atau error: beserta pesannya.

Tuliskan kodemu di Money.R. main.R berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

source("Money.R")

# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
parse_money <- function(t) {
  p <- strsplit(t, ":")[[1]]
  new("Money", amount = as.numeric(p[1]), currency = p[2])
}
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  a <- parse_money(p[1])
  tryCatch({
    if (p[2] == "+") print(a + parse_money(p[3]))
    if (p[2] == "*") print(a * as.numeric(p[3]))
    if (p[2] == "==") cat(a == parse_money(p[3]), "\n", sep = "")
  }, error = function(e) cat("error: ", conditionMessage(e), "\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