Menu
CoddyTech

Referenzklassen definieren

Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 37 von 57.

Referenzklassen (RC) sind das R-System für Objekte, die sich an Ort und Stelle ändern, wie in Java oder Python. setRefClass() deklariert eine Klasse mit typisierten Feldern und gibt einen Generator zurück; $new() erstellt ein Objekt, und $ liest und ändert seine Felder:

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)

Ausgabe:

Ada 150

Ein RC-Objekt ist eine Referenz, wie eine Umgebung. Wenn du es einer anderen Variablen zuweist oder an eine Funktion übergibst, wird es nicht kopiert, daher ist eine Änderung über einen beliebigen Namen eine Änderung am selben Objekt:

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)

Ausgabe:

55 55

Felder sind typisiert. Die Zuweisung eines Werts der falschen Klasse wird abgelehnt, und das Feld behält seinen alten Wert:

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")

Ausgabe:

invalid assignment for reference class field ‘balance’, should be from class “numeric” or a subclass (was class “character”) 
100 

Der Generator beschreibt die Klasse: Account$fields() listet die Felder und ihre Typen auf. Ein Objekt, das ohne eine show-Methode ausgegeben wird, listet seine Felder auf; ein Feld, dem kein Wert zugewiesen wurde, ist leer:

Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
print(Account$fields())
Account$new(owner = "Bo")

Ausgabe:

      owner     balance 
"character"   "numeric" 
Reference class object of class "Account"
Field "owner":
[1] "Bo"
Field "balance":
numeric(0)
challenge icon

Aufgabe

Einfach

Deklariere die Referenzklasse Book in Book.R mit den Feldern title und author (character) sowie pages (numeric), und behalte den Generator in Book. Schreibe dann add_pages(book, n), das n direkt zu den Seiten des Buches addiert und nichts Nützliches zurückgibt.

Der bereitgestellte Code liest title;author;pages, erstellt das Buch, weist es einer zweiten Variable zu, addiert die übrigen Zahlen über diesen zweiten Namen und gibt das ursprüngliche Buch sowie die Feldnamen aus.

Dein Code gehört in Book.R. main.R enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

source("Book.R")

# Vorgegebener Ein-/Ausgabecode: unverändert lassen
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-R-Compiler