Metotlar ve Alan Güncellemeleri
Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 38 / 57.
Metotlar methods listesine, setRefClass() içine eklenir. Bir metodun içinde alanlar yalın adlardır ve <<- bir alanı değiştirir. Coddy çalıştırıcısında, metotlar içeren bir sınıf tanımlandığında R isteğe bağlı codetools paketi hakkında bir not yazdırır; bu nedenle tanımı suppressMessages() ile sarın:
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
add = function(n = 1) {
count <<- count + n
},
report = function() paste("count is", count)
)
))
c1 <- Counter$new(count = 0)
c1$add()
c1$add(5)
print(c1$report())Çıktı:
[1] "count is 6".self, metodun çağrıldığı nesnedir. invisible(.self) ile biten bir metot nesneyi döndürür; böylece çağrılar zincirlenebilir:
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
add = function(n = 1) {
count <<- count + n
invisible(.self)
}
)
))
c1 <- Counter$new(count = 0)
c1$add(2)$add(3)$add(4)
print(c1$count)Çıktı:
[1] 9initialize yöntemi $new() içinde çalışır. initFields(...), kendisine geçirilen alanları ayarlar; ardından yöntem diğerlerine varsayılan değerler verebilir. Yöntemler birbirlerini adlarıyla çağırır:
Account <- suppressMessages(setRefClass("Account",
fields = list(owner = "character", balance = "numeric"),
methods = list(
initialize = function(...) {
initFields(...)
if (length(balance) == 0) balance <<- 0
invisible(.self)
},
deposit = function(x) balance <<- balance + x,
deposit_twice = function(x) {
deposit(x)
deposit(x)
}
)
))
a <- Account$new(owner = "Ada")
a$deposit_twice(10)
print(a$balance)Çıktı:
[1] 20Bir metodun içinde, bir alan adına yapılan yalın <- ataması, bu ada sahip yerel bir değişken oluşturur ve alanı değiştirmeden bırakır. Bir alanda yapılacak her değişiklik için <<- kullanın:
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
broken = function() count <- count + 1,
working = function() count <<- count + 1
)
))
c1 <- Counter$new(count = 0)
c1$broken()
c1$broken()
c1$working()
print(c1$count)Çıktı:
[1] 1Görev
KolayStack Referans Sınıfını Stack.R içinde tamamla. Öğelerini items alanında tutar (character, en üstteki son öğedir) ve dört yönteme sahiptir:
push(x),xöğesini üste ekler veinvisible(.self)döndürür; böylece ekleme işlemleri zincirlenebilir;pop(), en üstteki öğeyi kaldırıp döndürür veya yığın boş olduğundanothingdöndürür;peek(), en üstteki öğeyi kaldırmadan döndürür veyanothingdöndürür;size(), öğe sayısını döndürür.
Tanım zaten suppressMessages() ile sarılmıştır. Sağlanan kod push a b, pop ve peek komutlarını okur, ardından tek bir zincirlenmiş çağrıda iki öğe daha ekler ve boyutu yazdırır.
Kodun Stack.R dosyasına yazılmalıdır. main.R sağlanan giriş/çıkış 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 <- Stack$new()
for (cmd in input) {
if (startsWith(cmd, "push ")) {
items <- strsplit(substring(cmd, 6), " ")[[1]]
for (it in items) s$push(it)
} else if (cmd == "pop") {
cat("popped ", s$pop(), "\n", sep = "")
} else if (cmd == "peek") {
cat("top ", s$peek(), "\n", sep = "")
}
}
s$push("x")$push("y")
cat("size after two chained pushes: ", s$size(), "\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