Sprawdzanie poprawności
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 24 z 57.
Typy są sprawdzane przez R; reguły dotyczące wartości ustalasz samodzielnie. Argument validity funkcji setClass() to funkcja przyjmująca object, która zwraca TRUE, gdy obiekt jest poprawny, albo ciąg znaków opisujący problem. new() uruchamia ją dla każdego obiektu:
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)Wynik:
invalid class “Account” object: balance must not be negativeFunkcja sprawdzająca poprawność może zgłosić kilka problemów jednocześnie, zwracając wektor znakowy. R numeruje je w komunikacie o błędzie:
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)Wynik:
invalid class “Range” object: 1: lo must be one number
invalid class “Range” object: 2: hi must be one number@<- sprawdza typ, ale nie uruchamia funkcji sprawdzającej poprawność, więc przypisanie może naruszyć regułę. validObject() ponownie przeprowadza sprawdzenie; wywołaj ją po zmianie slotów:
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")Wynik:
still created: -99
invalid class “Account” object: balance must not be negative R umieszcza invalid class “Account” object: przed Twoim tekstem. Kod, który wyświetla komunikat użytkownikowi, może zachować tylko część po object: :
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))Wynik:
balance must not be negativeWyzwanie
ŁatwyZadeklaruj klasę Rating w pliku Rating.R ze slotami stars (numerycznym) i comment (znakowym) oraz funkcją sprawdzającą poprawność, która zwraca pierwszą niespełnioną regułę:
stars must be a whole number from 1 to 5, gdy liczba gwiazdek nie jest jedną z wartości 1, 2, 3, 4, 5;comment is too long, gdy komentarz ma więcej niż 20 znaków.
W przeciwnym razie zwraca TRUE. Dostarczony kod odczytuje wiersze 4;Great (komentarz może być pominięty), tworzy każdą ocenę i wyświetla ok: 4/5 albo tekst problemu.
Umieść swój kod w pliku Rating.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Rating.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 = "")
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy S3
Praca z plikamiListy z klasąFunkcje konstruktoraMetody print i formatWalidatory i funkcje pomocniczePowtórzenie — temperatury4Enkapsulacja w R
Domknięcia jako obiektyŚrodowiska jako obiektyFunkcje dostępoweOchrona stanuPodsumowanie – parkometr2Generics i metody S3
Generics i UseMethodMetody domyślneMetody dla podstawowych genericsPodstawy NextMethodPowtórzenie — pola figur5Klasy S4
Definiowanie klas S4Sloty i dostępSprawdzanie poprawnościMetody wyświetlaniaPodsumowanie – katalog produktów8Klasy referencyjne
Definiowanie klas referencyjnychMetody i aktualizacja pólSemantyka kopiowaniaDziedziczenie i callSuperPodsumowanie – kolejka zadań11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Dziedziczenie S3
Wektory klasKolejność wyszukiwania metodRozszerzanie za pomocą NextMethodSprawdzanie za pomocą inherits()Powtórzenie — lista płac pracownikówPoćwicz samodzielnie: Kompilator R online