Menu
Coddy logo textTech

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 negative

Funkcja 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 negative
challenge icon

Wyzwanie

Łatwy

Zadeklaruj 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 = "")
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator R online