Menu
Coddy logo textTech

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 150

Bir 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 55

Alanlar 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)
challenge icon

Görev

Kolay

Book 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 = "")
quiz iconKendini test et

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

Kendi başına pratik yap: Online R derleyicisi