Methoden und Feldänderungen
Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 38 von 57.
Methoden gehören in die methods-Liste von setRefClass(). Innerhalb einer Methode sind die Felder einfache Namen, und <<- ändert ein Feld. Im Coddy-Runner gibt R einen Hinweis auf das optionale Paket codetools aus, wenn eine Klasse mit Methoden definiert wird. Daher solltest du die Definition in suppressMessages() einschließen:
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
add = function(n = 1) {
count <<- count + n
},
report = function() paste("count is", count)
)
))
c1 <- Counter$new(count = 0)
c1$add()
c1$add(5)
print(c1$report())Ausgabe:
[1] "count is 6".self ist das Objekt, auf dem die Methode aufgerufen wurde. Eine Methode, die mit invisible(.self) endet, gibt das Objekt zurück, sodass Aufrufe verkettet werden können:
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
add = function(n = 1) {
count <<- count + n
invisible(.self)
}
)
))
c1 <- Counter$new(count = 0)
c1$add(2)$add(3)$add(4)
print(c1$count)Ausgabe:
[1] 9Die Methode initialize wird innerhalb von $new() ausgeführt. initFields(...) setzt die übergebenen Felder; anschließend kann die Methode den übrigen Feldern Standardwerte zuweisen. Methoden rufen einander über ihren Namen auf:
Account <- suppressMessages(setRefClass("Account",
fields = list(owner = "character", balance = "numeric"),
methods = list(
initialize = function(...) {
initFields(...)
if (length(balance) == 0) balance <<- 0
invisible(.self)
},
deposit = function(x) balance <<- balance + x,
deposit_twice = function(x) {
deposit(x)
deposit(x)
}
)
))
a <- Account$new(owner = "Ada")
a$deposit_twice(10)
print(a$balance)Ausgabe:
[1] 20Innerhalb einer Methode erstellt ein einfaches <- für einen Feldnamen eine lokale Variable mit diesem Namen und lässt das Feld unverändert. Verwende <<- für jede Änderung eines Feldes:
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
broken = function() count <- count + 1,
working = function() count <<- count + 1
)
))
c1 <- Counter$new(count = 0)
c1$broken()
c1$broken()
c1$working()
print(c1$count)Ausgabe:
[1] 1Aufgabe
EinfachVervollständige die Referenzklasse Stack in Stack.R. Sie speichert ihre Elemente im Feld items (vom Typ character, das oberste Element zuletzt) und verfügt über vier Methoden:
push(x)fügtxoben hinzu und gibtinvisible(.self)zurück, sodass Aufrufe verkettet werden können;pop()entfernt das oberste Element und gibt es zurück oder gibtnothingzurück, wenn der Stack leer ist;peek()gibt das oberste Element zurück, ohne es zu entfernen, odernothing;size()gibt die Anzahl der Elemente zurück.
Die Definition ist bereits in suppressMessages() eingeschlossen. Der bereitgestellte Code liest die Befehle push a b, pop und peek, fügt anschließend in einem verketteten Aufruf zwei weitere Elemente hinzu und gibt die Größe aus.
Dein Code gehört in Stack.R. main.R enthält den bereitgestellten Ein-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
source("Stack.R")
# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
s <- Stack$new()
for (cmd in input) {
if (startsWith(cmd, "push ")) {
items <- strsplit(substring(cmd, 6), " ")[[1]]
for (it in items) s$push(it)
} else if (cmd == "pop") {
cat("popped ", s$pop(), "\n", sep = "")
} else if (cmd == "peek") {
cat("top ", s$peek(), "\n", sep = "")
}
}
s$push("x")$push("y")
cat("size after two chained pushes: ", s$size(), "\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