Menu
Coddy logo textTech

Controlli di validità

Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 24 di 57.

I tipi vengono controllati da R; le regole sui valori le stabilisci tu. L’argomento validity di setClass() è una funzione di object che restituisce TRUE quando l’oggetto è valido, oppure una stringa di caratteri che descrive il problema. new() la esegue per ogni oggetto:

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)

Output:

invalid class “Account” object: balance must not be negative

Una funzione di validità può segnalare più problemi contemporaneamente restituendo un vettore di caratteri. R li numera nel messaggio di errore:

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)

Output:

invalid class “Range” object: 1: lo must be one number
invalid class “Range” object: 2: hi must be one number

@<- controlla il tipo ma non esegue la funzione di validità, quindi un’assegnazione può violare una regola. validObject() esegue di nuovo il controllo; chiamalo dopo aver modificato gli slot:

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

Output:

still created: -99 
invalid class “Account” object: balance must not be negative 

R mette invalid class “Account” object: prima del tuo testo. Il codice che mostra il messaggio a un utente può mantenere solo la parte dopo 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))

Output:

balance must not be negative
challenge icon

Sfida

Facile

Dichiara la classe Rating in Rating.R con gli slot stars (numerico) e comment (carattere) e una funzione di validità che restituisca la prima regola non rispettata:

  • stars must be a whole number from 1 to 5 quando le stelle non sono uno tra 1, 2, 3, 4, 5;
  • comment is too long quando il commento contiene più di 20 caratteri.

Altrimenti restituisce TRUE. Il codice fornito legge righe 4;Great (il commento può mancare), crea ogni valutazione e stampa ok: 4/5 oppure il testo del problema.

Il tuo codice va in Rating.R. main.R contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

source("Rating.R")

# Código de entrada/salida proporcionado: déjalo tal como está
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore R online