Menu
Coddy logo textTech

Geçerlilik Kontrolleri

Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 24 / 57.

Türler R tarafından denetlenir; değerlerle ilgili kurallar size aittir. setClass() işlevinin validity argümanı, nesne uygunsa TRUE döndüren veya sorunu açıklayan bir karakter dizisi döndüren object işlevdir. new() bunu her nesne için çalıştırır:

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)

Çıktı:

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

Bir geçerlilik işlevi, bir karakter vektörü döndürerek aynı anda birkaç sorun bildirebilir. R, hata iletisinde bunları numaralandırır:

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)

Çıktı:

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

@<- türü denetler ancak geçerlilik işlevini çalıştırmaz; bu nedenle bir atama bir kuralı ihlal edebilir. validObject() denetimi yeniden gerçekleştirir; yuvaları değiştirdikten sonra onu çağırın:

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

Çıktı:

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

R, metninizin önüne invalid class “Account” object: ifadesini ekler. Mesajı kullanıcıya gösteren kod, yalnızca object: sonrasındaki kısmı tutabilir:

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

Çıktı:

balance must not be negative
challenge icon

Görev

Kolay

Rating sınıfını, stars (numeric) ve comment (character) yuvalarıyla birlikte Rating.R içinde tanımlayın ve ilk ihlal edilen kuralı döndüren bir geçerlilik işlevi ekleyin:

  • Yıldızlar 1, 2, 3, 4 veya 5 değerlerinden biri olmadığında stars must be a whole number from 1 to 5;
  • yorum 20 karakterden uzun olduğunda comment is too long.

Aksi takdirde TRUE döndürür. Sağlanan kod, 4;Great satırlarını okur (yorum eksik olabilir), her puanlamayı oluşturur ve ok: 4/5 ya da sorun metnini yazdırır.

Kodunuz Rating.R dosyasına gitmelidir. main.R sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

source("Rating.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Tabanlı Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi