Gültigkeitsprüfungen
Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 24 von 57.
Typen werden von R überprüft; Regeln für Werte legst du selbst fest. Das validity-Argument von setClass() ist eine Funktion von object, die TRUE zurückgibt, wenn das Objekt in Ordnung ist, oder eine Zeichenkette, die das Problem beschreibt. new() führt sie für jedes Objekt aus:
setClass("Account", slots = c(owner = "character", balance = "numeric"),
validity = function(object) {
if (object@balance < 0) return("balance must not be negative")
TRUE
})
ok <- new("Account", owner = "Ada", balance = 10)
msg <- tryCatch(new("Account", owner = "Bo", balance = -5), error = function(e) conditionMessage(e))
cat(msg)Ausgabe:
invalid class “Account” object: balance must not be negativeEine Validierungsfunktion kann mehrere Probleme gleichzeitig melden, indem sie einen Zeichenvektor zurückgibt. R nummeriert sie in der Fehlermeldung:
setClass("Range", slots = c(lo = "numeric", hi = "numeric"),
validity = function(object) {
problems <- character(0)
if (length(object@lo) != 1) problems <- c(problems, "lo must be one number")
if (length(object@hi) != 1) problems <- c(problems, "hi must be one number")
if (length(problems) == 0) TRUE else problems
})
msg <- tryCatch(new("Range", lo = c(1, 2), hi = numeric(0)), error = function(e) conditionMessage(e))
cat(msg)Ausgabe:
invalid class “Range” object: 1: lo must be one number
invalid class “Range” object: 2: hi must be one number@<- prüft den Typ, führt aber die Gültigkeitsfunktion nicht aus, sodass eine Zuweisung eine Regel verletzen kann. validObject() führt die Prüfung erneut aus; rufe sie nach dem Ändern von Slots auf:
setClass("Account", slots = c(balance = "numeric"),
validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
a <- new("Account", balance = 10)
a@balance <- -99
cat("still created:", a@balance, "\n")
msg <- tryCatch(validObject(a), error = function(e) conditionMessage(e))
cat(msg, "\n")Ausgabe:
still created: -99
invalid class “Account” object: balance must not be negative R setzt invalid class “Account” object: vor Ihren Text. Code, der die Meldung einem Benutzer anzeigt, kann nur den Teil nach object: beibehalten:
setClass("Account", slots = c(balance = "numeric"),
validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
msg <- tryCatch(new("Account", balance = -1), error = function(e) conditionMessage(e))
cat(sub(".*object: ", "", msg))Ausgabe:
balance must not be negativeAufgabe
EinfachDeklariere die Klasse Rating in Rating.R mit den Slots stars (numerisch) und comment (Zeichenkette) sowie einer Gültigkeitsfunktion, die die erste verletzte Regel zurückgibt:
stars must be a whole number from 1 to 5, wenn die Sterne nicht 1, 2, 3, 4 oder 5 entsprechen;comment is too long, wenn der Kommentar mehr als 20 Zeichen enthält.
Andernfalls gibt sie TRUE zurück. Der bereitgestellte Code liest Zeilen wie 4;Great ein (der Kommentar kann fehlen), erstellt jede Bewertung und gibt ok: 4/5 oder den Problemtext aus.
Dein Code gehört in Rating.R. main.R enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
source("Rating.R")
# Gelieferter Input/Output-Code: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
out <- tryCatch({
r <- new("Rating", stars = as.numeric(p[1]), comment = if (length(p) > 1) p[2] else "")
paste0("ok: ", r@stars, "/5")
}, error = function(e) sub(".*object: ", "", conditionMessage(e)))
cat(out, "\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