Sınıf Vektörleri
Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 12 / 57.
S3 kalıtımı sınıf vektöründen gelir. class = c("manager", "employee") değerine sahip bir nesne hem yöneticidir hem de çalışandır. Bir generic’in manager için yöntemi olmadığında, gönderim devam eder ve employee yöntemini kullanır:
pay <- function(x) UseMethod("pay")
pay.employee <- function(x) x$salary / 12
m <- structure(list(name = "Ada", salary = 60000), class = c("manager", "employee"))
print(class(m))
print(pay(m))Çıktı:
[1] "manager" "employee"
[1] 5000Her kurucuda sınıf vektörünü elle yazmak, üst sınıfın ayrıntılarını tekrarlar. Bunun yerine üst sınıf kurucusu bir class argümanı alır ve bunu kendi sınıfının önüne koyar; alt sınıf kurucusu da üst sınıf kurucusunu çağırır:
new_employee <- function(name, salary, ..., class = character()) {
structure(list(name = name, salary = salary, ...), class = c(class, "employee"))
}
new_manager <- function(name, salary, reports) {
new_employee(name, salary, reports = reports, class = "manager")
}
m <- new_manager("Ada", 60000, 4)
print(class(m))
print(names(m))Çıktı:
[1] "manager" "employee"
[1] "name" "salary" "reports"Ebeveyn kurucunun ... öğesi, çocuğun ek alanlarını (burada reports) toplar ve bunları ebeveynin kendi alanlarından sonra yerleştirir. Sıradan bir çalışanın hiç reports alanı yoktur:
new_employee <- function(name, salary, ..., class = character()) {
structure(list(name = name, salary = salary, ...), class = c(class, "employee"))
}
e <- new_employee("Bo", 40000)
print(class(e))
print(names(e))Çıktı:
[1] "employee"
[1] "name" "salary"Sınıf vektörünün sırası önemlidir: en özel sınıf ilk sırada gelir. Üst sınıf ilk sırada olduğunda, onun yöntemleri kazanır ve alt sınıfın yöntemleri hiçbir zaman kullanılmaz:
title <- function(x) UseMethod("title")
title.employee <- function(x) "employee"
title.manager <- function(x) "manager"
right <- structure(list(), class = c("manager", "employee"))
wrong <- structure(list(), class = c("employee", "manager"))
print(title(right))
print(title(wrong))Çıktı:
[1] "manager"
[1] "employee"Görev
KolayÇalışanlar ve yöneticiler iki dosyaya ayrılmıştır. Employee.R içindeki new_employee(name, salary, ..., class = character()) işlevini tamamlayın: name, salary ve ... içindeki tüm ek alanları içeren bir liste ile c(class, "employee") sınıf vektörünü döndürür. Ardından Manager.R içindeki new_manager(name, salary, reports) işlevini tamamlayın; bu işlev, reports ek alanı ve manager sınıfıyla new_employee() işlevini çağırır.
label() ve employee yöntemi verilmiştir, bu nedenle yöneticiler kendi yöntemleri olmadan da bir etiket alır. Sağlanan kod, employee Bo 40000 veya manager Ada 60000 4 satırlarını okur ve sınıf vektörünü, alan adlarını ve etiketi yazdırır.
Kodunuzu Employee.R ve Manager.R dosyalarına yazın. main.R, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
source("Employee.R")
source("Manager.R")
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
x <- if (p[1] == "manager") new_manager(p[2], as.numeric(p[3]), as.numeric(p[4])) else new_employee(p[2], as.numeric(p[3]))
cat("class: ", paste(class(x), collapse = ", "), "\n", sep = "")
cat("fields: ", paste(names(x), collapse = ", "), "\n", sep = "")
cat(label(x), "\n", sep = "")
}
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
1S3 Temelleri
Dosyalarla ÇalışmaSınıf ile ListelerYapıcı FonksiyonlarPrint ve Format MetotlarıDoğrulayıcılar ve YardımcılarTekrar - Sıcaklıklar4R'da Kapsülleme
Nesne Olarak Closure'larNesne Olarak OrtamlarErişimci FonksiyonlarDurumu KorumaÖzet - Parkmetre2S3 Generic'leri ve Metotları
Generic'ler ve UseMethodVarsayılan MetotlarTemel Generic'ler için MetotlarNextMethod TemelleriTekrar - Şekil Alanları5S4 Sınıfları
S4 Sınıflarını TanımlamaSlotlar ve ErişimGeçerlilik KontrolleriShow MetotlarıÖzet - Ürün Kataloğu8Referans Sınıfları
Referans Sınıflarını TanımlamaMetotlar ve Alan GüncellemeleriKopyalama SemantiğiKalıtım ve callSuperÖzet - Görev Kuyruğu11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3S3 Kalıtımı
Sınıf VektörleriMetot Arama SırasıNextMethod ile Genişletmeinherits() ile DenetlemeÖzet - Personel BordrosuKendi başına pratik yap: Online R derleyicisi