Slotlar ve Erişim
Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 23 / 57.
obj@slot <- value bir slot'u değiştirir. S3 nesneleri gibi, S4 nesneleri de değerlerdir: Birini değiştiren bir işlev kendi kopyası üzerinde çalışır ve onu döndürür:
setClass("Person", slots = c(name = "character", age = "numeric"))
birthday <- function(p) {
p@age <- p@age + 1
p
}
ada <- new("Person", name = "Ada", age = 36)
older <- birthday(ada)
cat(ada@age, older@age)Çıktı:
36 37slot(obj, "name"), dize içindeki slot adıyla @ ile aynı işi yapar; bu nedenle bir değişkende tutulan adla çalışır. slotNames() bir sınıfın veya nesnenin slot'larını listeler:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
for (s in slotNames(ada)) cat(s, "=", format(slot(ada, s)), "\n")
slot(ada, "age") <- 37
print(ada@age)Çıktı:
name = Ada
age = 36
[1] 37Her atama yalnızca new() için değil, bildirilen türe karşı da kontrol edilir. Yanlış bir değer reddedilir ve nesne eski değerini korur:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
ada@age <- "old"Çıktı:
Error in (function (cl, name, valueClass) :
assignment of an object of class “character” is not valid for @‘age’ in an object of class “Person”; is(value, "numeric") is not TRUE
Execution haltedgetSlots(), her yuva adını bildirilmiş türüyle birlikte döndürür; bu da kodun metin girdisini bir yuvanın beklediği türe dönüştürmesini sağlar:
setClass("Person", slots = c(name = "character", age = "numeric"))
types <- getSlots("Person")
print(types)
value <- "40"
if (types[["age"]] == "numeric") value <- as.numeric(value)
print(value + 1)Çıktı:
name age
"character" "numeric"
[1] 41Görev
KolayProfile.R içindeki Profile sınıfı name ve city (karakter) ile age (sayısal) yuvalarına sahiptir. İki işlevi tamamlayın:
update_profile(p, field, value), alan bir yuva olmadığındano field emailile durur (call. = FALSEkullanın); aksi takdirde yuva sayısalsa metinvaluedeğerinias.numeric()ile dönüştürür, yuvayıslot()ile ayarlar ve değiştirilmiş profili döndürür.profile_lines(p), yuva sırasına göre her yuva için bir satır döndürür:name: Ada.
Sağlanan kod bir ad okur, ardından city=Paris veya age=36 satırlarını okur, her birini uygular ve profilin satırlarını yazdırır.
Kodunuz Profile.R dosyasına yazılmalıdır. main.R sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
source("Profile.R")
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
p <- new("Profile", name = input[1], city = "unknown", age = 0)
for (line in input[-1]) {
kv <- strsplit(line, "=")[[1]]
p <- tryCatch(update_profile(p, kv[1], kv[2]), error = function(e) {
cat("error: ", conditionMessage(e), "\n", sep = "")
p
})
}
for (l in profile_lines(p)) cat(l, "\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ç AlmaKendi başına pratik yap: Online R derleyicisi