Menu
Coddy logo textTech

Yerleşik İşlevler için Metotlar

Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 28 / 57.

setMethod() ayrıca length() ve summary() gibi temel işlevlere S4 yöntemleri ekler. Temel işlev diğer her şey için çalışmaya devam eder ve sınıfınız kendine özgü davranışa sahip olur:

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)))

Çıktı:

[1] 3
[1] 2

Operatörler de generic'tir. + için bir metot, bir signature() içinde her iki tarafın sınıflarını belirtir. İki argümana e1 ve e2 adları verilir:

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)

Çıktı:

6.50 

grup generic Arith, +, -, *, /, ^ ve geri kalanların tümünü aynı anda temsil eder. Metodunun içinde callGeneric(), geçirdiğiniz değerler üzerinde hangi operatör kullanıldıysa onu tekrarlar:

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)

Çıktı:

30 2.5 9

Compare grup geneli, ==, <, > ve diğerlerini kapsar. Yöntemi, yuvalar için callGeneric() tarafından döndürülen değeri, mantıksal bir değeri döndürür:

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)

Çıktı:

TRUE FALSE FALSE
challenge icon

Görev

Kolay

Money sınıfı Money.R içinde amount (sayısal) ve currency (karakter) yuvalarına sahiptir. Dört yöntem ekleyin:

  • show(), 12.50 EUR ve yeni bir satır yazdırır;
  • iki Money nesnesi için +, toplamlarını döndürür veya para birimleri farklı olduğunda cannot add EUR and USD ile durur (call. = FALSE kullanın);
  • Money ve bir sayı için *, ölçeklendirilmiş tutarı döndürür;
  • iki Money nesnesi için ==, tutar ve para biriminin ikisi de eşit olduğunda TRUE olur.

Sağlanan kod 10:EUR + 2.5:EUR, 4:USD * 3 veya 1:EUR == 1:EUR satırlarını okur ve sonucu ya da error: iletisini yazdırır.

Kodunuz Money.R dosyasına gider. main.R sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

source("Money.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Tabanlı Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi