Menu
Coddy logo textTech

Temel Generic'ler için Metotlar

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

Temel R'deki birçok işlev S3 generic'idir: print(), format(), summary(), toString(), length(), as.character() ve daha fazlası. Bir yöntem eklemek, sınıfınızın her R kullanıcısının zaten bildiği bir işlevle çalışmasını sağlar. summary.gradebook() bütün bir nesne hakkında rapor verir:

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

Çıktı:

3 marks, average 82 

Yöntemi yazmadan önce generic'in parametrelerini kontrol edin: summary() ilk argümanını object olarak adlandırırken, toString() ve format() onu x olarak adlandırır. toString() tek bir dize döndürmelidir:

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

Çıktı:

[1] "70 / 85 / 91"

Bir length() yöntemi, sınıf için length() ifadesinin anlamını değiştirir. Öğelerini bir alanda saklayan bir kuyruk, listedeki alanların sayısı yerine kaç öğe içerdiğini bildirebilir:

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

Çıktı:

[1] 2
[1] 3

Operatörler de jeneriktir. Sembol nedeniyle tırnak işaretleriyle yazılan "+.money" adlı bir yöntem, + işleminin iki tarafından biri money nesnesi olduğunda çalışır. İki tarafı e1 ve e2 olarak alır:

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)

Çıktı:

[1] 12
[1] FALSE
challenge icon

Görev

Kolay

Bir yığın, öğelerini items alanında tutar; yığının en üstündeki öğe sondadır. Stack.R içindeki new_stack(), push() ve pop() verilmiştir. Üç yöntem ekleyin:

  • length.stack() öğe sayısını döndürür.
  • toString.stack() öğeleri yukarıdan aşağıya | ile birleştirilmiş şekilde veya empty döndürür.
  • summary.stack() stack of 3, top: c döndürür; yığın boş olduğunda stack of 0 döndürür.

Verilen kod, push <item> ve pop komutlarını okur, ardından uzunluğu, toString() ve summary() sonuçlarını yazdırır.

Kodunuz Stack.R dosyasına gider. main.R, verilen girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

source("Stack.R")

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