Erişimci Fonksiyonlar
Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 19 / 57.
Kapsülleme, diğer kodların bir nesnenin alanlarına doğrudan erişmek yerine işlevler aracılığıyla nesneyle çalışması anlamına gelir. Bir getter bir değeri okur, setter ise onu değiştirir. Bir S3 listesi için setter, değiştirilen kopyayı döndürür:
new_member <- function(name) structure(list(name = name), class = "member")
get_name <- function(p) p$name
set_name <- function(p, value) {
p$name <- value
p
}
p <- new_member("ada")
p <- set_name(p, "Ada Lovelace")
print(get_name(p))Çıktı:
[1] "Ada Lovelace"Erişimci işlevler, nesnenin verileri saklama biçimini, onu kullanan kodu bozmadan değiştirmesine olanak tanır. Bu termometre Celsius değerini saklar ve bir getter istendiğinde Fahrenheit değerini hesaplar; böylece çağıranlar alanın kendisini hiçbir zaman görmez:
new_thermo <- function(c) structure(list(c = c), class = "thermo")
celsius <- function(t) t$c
fahrenheit <- function(t) t$c * 9 / 5 + 32
t <- new_thermo(25)
cat(celsius(t), fahrenheit(t))Çıktı:
25 77R'nin names(x) <- ... gibi kendi setter'ları replacement function'lardır. x ve value parametrelerine sahip "name<-" adlı bir işlev, çağıranların name(p) <- "Bo" yazmasına olanak tanır; R bu işlevi çağırır ve sonucu tekrar p'ye atar:
new_member <- function(name) structure(list(name = name), class = "member")
name <- function(p) p$name
"name<-" <- function(x, value) {
x$name <- trimws(value)
x
}
p <- new_member("ada")
name(p) <- " Bo "
print(name(p))Çıktı:
[1] "Bo"Bir kapanış nesnesinin getter'ı, özel verilerin bir kopyasını döndürür. Bu kopyayı değiştirmek nesneyi değiştirmez; dolayısıyla nesneye erişmenin tek yolu nesnenin kendi işlevleridir:
make_list <- function() {
items <- character(0)
list(add = function(x) items <<- c(items, x),
get_items = function() items)
}
todo <- make_list()
todo$add("milk")
mine <- todo$get_items()
mine[1] <- "HACKED"
print(todo$get_items())Çıktı:
[1] "milk"Görev
KolayBir kişi, name ve email alanlarına sahip, contact sınıfında bir S3 listesidir. Contact.R dosyasını tamamlayın:
new_contact(name, email), e-postayı boşlukları temizlenmiş ve küçük harfe dönüştürülmüş olarak saklar.contact_name(x)vecontact_email(x)alıcı işlevlerini tanımlayın.- Yeni e-postayı boşlukları temizlenmiş ve küçük harfe dönüştürülmüş olarak saklayan
"contact_email<-"değiştirme işlevini tanımlayın; böylece çağıranlarcontact_email(c1) <- valueyazabilir.
Sağlanan kod name,email değerini, ardından yeni e-postaları okur ve her değişiklikten sonra Ada <ada@x.com> değerini, en sonda da saklanan alan adlarını yazdırır.
Kodunuz Contact.R dosyasına gitmelidir. main.R sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
source("Contact.R")
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ",")[[1]]
c1 <- new_contact(p[1], p[2])
cat(contact_name(c1), " <", contact_email(c1), ">\n", sep = "")
for (value in input[-1]) {
contact_email(c1) <- value
cat(contact_name(c1), " <", contact_email(c1), ">\n", sep = "")
}
cat("stored fields: ", paste(names(unclass(c1)), collapse = ", "), "\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