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 direkt ä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 150Ein RC-Objekt ist eine Referenz, wie eine Umgebung. Wenn du es einer anderen Variablen zuweist oder an eine Funktion übergibst, wird es nicht kopiert, sodass eine Änderung über einen beliebigen Namen eine Änderung an demselben Objekt ist:
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 55Felder sind typisiert. Das Zuweisen 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)Aufgabe
EinfachDeklariere die Referenzklasse Book in Book.R mit den Feldern title und author (character) sowie pages (numeric), und belasse den Generator in Book. Schreibe anschließend add_pages(book, n), das n zu den Seiten des Buches direkt hinzufügt und nichts Nützliches zurückgibt.
Der bereitgestellte Code liest title;author;pages, erstellt das Buch, weist es einer zweiten Variablen zu, fügt die übrigen Zahlen über diesen zweiten Namen hinzu und gibt das ursprüngliche Buch sowie die Feldnamen aus.
Dein Code gehört in Book.R. main.R enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
source("Book.R")
# Bereitgestellter Ein-/Ausgabecode: belasse ihn wie er ist
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 = "")
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1S3-Grundlagen
Arbeiten mit DateienListen mit einer KlasseKonstruktorfunktionenPrint- und Format-MethodenValidatoren und HilfsfunktionenRückblick – Temperaturen4Kapselung in R
Closures als ObjekteUmgebungen als ObjekteZugriffsfunktionenZustand schützenRückblick – Parkuhr2S3-Generics und Methoden
Generics und UseMethodStandardmethodenMethoden für Basis-GenericsGrundlagen von NextMethodWiederholung – Flächeninhalte von Formen5S4-Klassen
S4-Klassen definierenSlots und ZugriffGültigkeitsprüfungenShow-MethodenRückblick – Produktkatalog8Referenzklassen
Referenzklassen definierenMethoden und FeldänderungenKopiersemantikVererbung und callSuperZusammenfassung – Aufgabenwarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Online-R-Compiler