Menu
Coddy logo textTech

Comprobaciones de validez

Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 24 de 57.

R comprueba los tipos; las reglas sobre los valores dependen de ti. El argumento validity de setClass() es una función de object que devuelve TRUE cuando el objeto es válido, o una cadena de caracteres que describe el problema. new() la ejecuta para cada objeto:

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)

Salida:

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

Una función de validación puede informar de varios problemas a la vez devolviendo un vector de caracteres. R los numera en el mensaje de error:

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)

Salida:

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

@<- comprueba el tipo, pero no ejecuta la función de validación, por lo que una asignación puede infringir una regla. validObject() vuelve a ejecutar la comprobación; llámala después de cambiar los slots:

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

Salida:

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

R coloca invalid class “Account” object: delante de tu texto. El código que muestra el mensaje a un usuario puede conservar solo la parte posterior a 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))

Salida:

balance must not be negative
challenge icon

Desafío

Fácil

Declara la clase Rating en Rating.R con los slots stars (numeric) y comment (character), y una función de validación que devuelve la primera regla incumplida:

  • stars must be a whole number from 1 to 5 cuando las estrellas no son uno de 1, 2, 3, 4 o 5;
  • comment is too long cuando el comentario tiene más de 20 caracteres.

De lo contrario, devuelve TRUE. El código proporcionado lee líneas como 4;Great (el comentario puede faltar), crea cada valoración e imprime ok: 4/5 o el texto del problema.

Tu código va en Rating.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

source("Rating.R")

# Código de entrada/salida suministrado: 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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de R online