Referans Sınıflarını Tanımlama
Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 37 / 57.
Referans Sınıfları (RC), Java veya Python'da olduğu gibi yerinde değiştirilen nesneler için R'nin sistemidir. setRefClass(), tür belirtilmiş alanlara sahip bir sınıf tanımlar ve bir oluşturucu döndürür; $new() bir nesne oluşturur ve $ alanlarını okur ve değiştirir:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
a$balance <- a$balance + 50
cat(a$owner, a$balance)Çıktı:
Ada 150Bir RC nesnesi, bir ortam gibi bir başvurudur. Onu başka bir değişkene atamak veya bir işleve geçirmek nesneyi kopyalamaz; bu nedenle herhangi bir ad üzerinden yapılan değişiklik, aynı nesnede yapılan bir değişikliktir:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
pay_fee <- function(acc) acc$balance <- acc$balance - 5
a <- Account$new(owner = "Ada", balance = 100)
b <- a
b$balance <- 60
pay_fee(a)
cat(a$balance, b$balance)Çıktı:
55 55Alanlar türle belirtilir. Yanlış sınıfa ait bir değer atamak reddedilir ve alan eski değerini korur:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
msg <- tryCatch({ a$balance <- "lots"; "changed" }, error = function(e) conditionMessage(e))
cat(msg, "\n")
cat(a$balance, "\n")Çıktı:
invalid assignment for reference class field ‘balance’, should be from class “numeric” or a subclass (was class “character”)
100 Üretici sınıfı açıklar: Account$fields() alanları ve türlerini listeler. show yöntemi olmayan bir nesne alanlarını listeler; değer atanmamış bir alan boştur:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
print(Account$fields())
Account$new(owner = "Bo")Çıktı:
owner balance
"character" "numeric"
Reference class object of class "Account"
Field "owner":
[1] "Bo"
Field "balance":
numeric(0)Görev
KolayBook Referans Sınıfını, Book.R içinde title ve author (karakter) ile pages (sayısal) alanlarına sahip olacak şekilde tanımlayın ve oluşturucuyu Book içinde tutun. Ardından, kitabın sayfalarına yerinde n ekleyen ve yararlı bir şey döndürmeyen add_pages(book, n) işlevini yazın.
Sağlanan kod title;author;pages değerlerini okur, kitabı oluşturur, onu ikinci bir değişkene verir, kalan sayıları bu ikinci ad üzerinden ekler ve özgün kitabı ile alan adlarını yazdırır.
Kodunuz Book.R dosyasına yerleştirilmelidir. main.R sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
source("Book.R")
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ";")[[1]]
b <- Book$new(title = p[1], author = p[2], pages = as.numeric(p[3]))
alias <- b
for (n in as.numeric(input[-1])) add_pages(alias, n)
cat(b$title, " by ", b$author, ": ", b$pages, " pages\n", sep = "")
cat("fields: ", paste(names(Book$fields()), 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