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 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, 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 55Felder 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)Aufgabe
EinfachDeklariere 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 = "")
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