Prüfen mit inherits()
Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 15 von 57.
inherits(x, "employee") fragt, ob employee irgendwo im Klassenvektor von x vorkommt, daher ist das Ergebnis auch für Manager TRUE. Der Vergleich mit class(x) == "employee" prüft jede Position einzeln und liefert einen Vektor, was in einem if fehlschlägt:
m <- structure(list(), class = c("manager", "employee"))
print(inherits(m, "employee"))
print(inherits(m, "intern"))
print(class(m) == "employee")Ausgabe:
[1] TRUE
[1] FALSE
[1] FALSE TRUEBei mehreren Namen ist inherits() TRUE, wenn das Objekt einen beliebigen davon besitzt. Mit which = TRUE gibt es für jeden Namen seine Position im Klassenvektor zurück oder 0, wenn er fehlt:
p <- structure(list(), class = c("fragile", "express", "parcel"))
print(inherits(p, c("letter", "parcel")))
print(inherits(p, c("express", "letter", "parcel"), which = TRUE))Ausgabe:
[1] TRUE
[1] 2 0 3Eine Funktion, die nur für eine bestimmte Klassenfamilie sinnvoll ist, prüft ihr Argument mit inherits() und bricht andernfalls mit einer klaren Meldung ab:
raise <- function(x, pct) {
if (!inherits(x, "employee")) stop("raise() needs an employee", call. = FALSE)
x$salary <- x$salary * (1 + pct / 100)
x
}
m <- structure(list(salary = 50000), class = c("manager", "employee"))
print(raise(m, 10)$salary)
print(tryCatch(raise(list(salary = 1), 10), error = function(e) conditionMessage(e)))Ausgabe:
[1] 55000
[1] "raise() needs an employee"Filter() mit inherits() wählt die Mitglieder einer Familie aus einer gemischten Liste aus, einschließlich jeder Unterklasse:
staff <- list(
structure(list(name = "Ada"), class = c("manager", "employee")),
structure(list(name = "Bo"), class = "employee"),
structure(list(name = "Cy"), class = c("intern", "employee")),
structure(list(name = "Dee"), class = c("director", "manager", "employee"))
)
managers <- Filter(function(x) inherits(x, "manager"), staff)
print(vapply(managers, function(x) x$name, character(1)))Ausgabe:
[1] "Ada" "Dee"Aufgabe
EinfachEin Katalog enthält Bücher, E-Books und DVDs. Die Konstruktoren sind in Item.R, Book.R, Ebook.R und Dvd.R angegeben; ein E-Book hat die Klasse c("ebook", "book", "item"). Vervollständige in Catalogue.R zwei Funktionen mit inherits():
count_of(items, kind)gibt zurück, wie viele Elementekindan beliebiger Stelle in ihrem Klassenvektor enthalten.titles_of(items, kind)gibt die Titel dieser Elemente in ihrer Reihenfolge zurück.
Der bereitgestellte Code liest die Zeilen book Dune, ebook Emma, dvd Alien sowie Abfragen wie ? book und gibt book: 2 (Dune, Emma) aus – oder nur dvd: 0, wenn nichts übereinstimmt.
Dein Code gehört in Item.R, Book.R, Ebook.R, Dvd.R und Catalogue.R. main.R enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
source("Item.R")
source("Book.R")
source("Ebook.R")
source("Dvd.R")
source("Catalogue.R")
# Bereitgestellter Ein-/Ausgabecode: belasse ihn unverändert
input <- suppressWarnings(readLines(file("stdin")))
items <- list()
for (line in input) {
p <- strsplit(line, " ")[[1]]
rest <- paste(p[-1], collapse = " ")
if (p[1] == "?") {
titles <- titles_of(items, p[2])
shown <- if (length(titles) > 0) paste0(" (", paste(titles, collapse = ", "), ")") else ""
cat(p[2], ": ", count_of(items, p[2]), shown, "\n", sep = "")
} else {
items[[length(items) + 1]] <- switch(p[1], book = new_book(rest), ebook = new_ebook(rest), dvd = new_dvd(rest))
}
}
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 ausleihen3S3-Vererbung
KlassenvektorenReihenfolge der MethodensucheErweitern mit NextMethodPrüfen mit inherits()Rückblick – MitarbeiterabrechnungÜbe selbstständig: Online-R-Compiler