Menu
Coddy logo textTech

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

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

Aufgabe

Einfach

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