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, dağıtım 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, ebeveynin ayrıntılarını tekrarlar. Bunun yerine ebeveyn kurucu bir class bağımsız değişkeni alır ve bunu kendi sınıfının önüne koyar; alt sınıf kurucusu da ebeveyn kurucuyu ç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"Ana kurucunun ... ifadesi, çocuğa ait ek alanları (burada reports) toplar ve bunları ana kurucunun kendi alanlarının arkasına 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 önce gelir. Üst sınıf önce geldiğinde, 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: bu işlev name, salary ve ... içindeki tüm ek alanları içeren bir listeyi, c(class, "employee") sınıf vektörüyle birlikte 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ını ve manager sınıfını kullanarak new_employee() işlevini çağırır.
label() ve onun employee yöntemi verilmiştir; bu nedenle yöneticiler kendilerine ait bir yöntem 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.
Kodunuz Employee.R ve Manager.R dosyalarına yazılmalıdır. 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