Listen mit einer Klasse
Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 2 von 57.
S3 ist R's ältestes und am häufigsten verwendetes Objektsystem. Ein S3-Objekt ist eine gewöhnliche Liste mit einem class-Attribut, einer Bezeichnung, die angibt, um welche Art von Objekt es sich handelt. class(x) <- "dog" legt die Bezeichnung fest:
rex <- list(name = "Rex", age = 3)
class(rex) <- "dog"
print(class(rex))
cat(rex$name, "is", rex$age)Ausgabe:
[1] "dog"
Rex is 3structure() erstellt den Wert und legt seine Attribute in einem einzigen Aufruf fest. Das ist die übliche Methode, um ein S3-Objekt zu erstellen. Auf die Felder greifst du wie bei jeder Liste mit $ zu:
rex <- structure(list(name = "Rex", age = 3), class = "dog")
print(class(rex))
print(is.list(rex))
print(rex$age)Ausgabe:
[1] "dog"
[1] TRUE
[1] 3Die Klasse ist lediglich eine Bezeichnung: R prüft nicht, welche Felder ein Objekt hat, daher kann jede Liste als dog bezeichnet werden. unclass() entfernt die Bezeichnung und gibt die einfache Liste zurück:
p <- structure(list(x = 1, y = 2), class = "point")
print(unclass(p))Ausgabe:
$x
[1] 1
$y
[1] 2S3-Objekte sind Werte. Eine Funktion, die ein Objekt ändert, ändert ihre eigene Kopie, also gibt sie die neue Version zurück und der Aufrufer weist sie zu. Das Original bleibt unverändert:
birthday <- function(d) {
d$age <- d$age + 1
d
}
rex <- structure(list(name = "Rex", age = 3), class = "dog")
older <- birthday(rex)
cat(rex$age, older$age)Ausgabe:
3 4Aufgabe
EinfachVervollständige make_pet(name, species, age) in Pet.R. Die Funktion gibt eine Liste mit den Feldern name, species und age in dieser Reihenfolge sowie der Klasse pet zurück. Vervollständige dann describe_pet(p), das einen Satz zurückgibt: Ein Haustier namens Rex, der Spezies dog und im Alter von 3 ergibt Rex is a 3 year old dog.
Der bereitgestellte Code liest den Namen, die Spezies und das Alter ein, erstellt das Haustier und gibt seine Klasse, seine Feldnamen und den Satz aus.
Dein Code gehört in Pet.R. main.R enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
source("Pet.R")
# Vorgegebener Eingabe-/Ausgabecode: unverändert lassen
input <- suppressWarnings(readLines(file("stdin")))
p <- make_pet(input[1], input[2], as.numeric(input[3]))
cat("class: ", class(p), "\n", sep = "")
cat("fields: ", paste(names(p), collapse = ", "), "\n", sep = "")
cat(describe_pet(p), "\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