Menu
CoddyTech

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 150

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

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

Görev

Kolay

Book.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 = "")
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