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'daki gibi, yerinde değişen nesneler için R'nin sistemidir. setRefClass(), türleri belirlenmiş alanlara sahip bir sınıf tanımlar ve bir üreteç 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 kopyasını oluşturmaz; bu nedenle herhangi bir ad üzerinden yapılan değişiklik, tek 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ürlenmiştir. Yanlış sınıftan 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 olmadan yazdırılan 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.R içinde Book Referans Sınıfı'nı title ve author (character) ile pages (numeric) alanlarıyla tanımlayın ve oluşturucuyu Book içinde tutun. Ardından, kitabın sayfa sayısına yerinde n ekleyen ve kullanışlı bir değer döndürmeyen add_pages(book, n) işlevini yazın.
Verilen kod title;author;pages değerlerini okur, kitabı oluşturur, ikinci bir değişkene atar, kalan sayıları bu ikinci ad üzerinden ekler ve özgün kitabı ve alan adlarını yazdırır.
Kodunuzu Book.R içine yazın. main.R, verilen giriş/çıkış 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