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 negativeUna 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 negativeSfida
FacileDichiara 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 5quando le stelle non sono uno tra 1, 2, 3, 4, 5;comment is too longquando 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 = "")
}
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
1Nozioni di base su S3
Lavorare con i fileListe con una classeFunzioni costruttriciMetodi di stampa e formattazioneValidatori e funzioni di supportoRipasso - Temperature4Incapsulamento in R
Chiusure come oggettiAmbienti come oggettiFunzioni di accessoProteggere lo statoRiepilogo - Parcometro2Generics e metodi S3
Generics e UseMethodMetodi predefinitiMetodi per i generics di baseNozioni di base su NextMethodRiepilogo - Aree delle forme5Classi S4
Definire le classi S4Slot e accessoControlli di validitàMetodi showRiepilogo - Catalogo prodotti8Classi di riferimento
Definizione delle classi di riferimentoMetodi e aggiornamenti dei campiSemantica della copiaEreditarietà e callSuperRiepilogo - coda di attività11Progetto: Gestione della biblioteca
Libri e iscrittiPrestito dei libriEsercitati da solo: Compilatore R online