Menu
Coddy logo textTech

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 Kennzeichnung, die angibt, um welche Art von Objekt es sich handelt. class(x) <- "dog" legt die Kennzeichnung fest:

rex <- list(name = "Rex", age = 3)
class(rex) <- "dog"
print(class(rex))
cat(rex$name, "is", rex$age)

Ausgabe:

[1] "dog"
Rex is 3

structure() erstellt den Wert und legt seine Attribute in einem einzigen Aufruf fest, was die übliche Methode zum Erstellen eines S3-Objekts ist. Auf die Felder wird wie bei jeder Liste mit $ zugegriffen:

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] 3

Die Klasse ist nur ein Bezeichner: R überprüft nicht, welche Felder ein Objekt hat, daher kann jede Liste dog genannt werden. unclass() entfernt den Bezeichner 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] 2

S3-Objekte sind Werte. Eine Funktion, die ein Objekt ändert, ändert ihre eigene Kopie. Daher gibt sie die neue Version zurück, und der Aufrufer weist sie einer Variablen 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 4
challenge icon

Aufgabe

Einfach

Vervollstä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 anschließend describe_pet(p), das einen Satz zurückgibt: Ein Haustier mit dem Namen Rex, der Spezies dog und dem Alter 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 Eingabe-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

source("Pet.R")

# Bereitgestellter Ein-/Ausgabecode: belasse ihn wie er ist
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 = "")
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