Menu
CoddyTech

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 3

structure() 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] 3

Die 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] 2

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