Durumu Koruma
Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 20 / 57.
Bir setter, bir değerin değişebileceği tek yerdir; bu nedenle kuralları uygulamak için doğru yerdir. Önce kontrol eder ve herhangi bir şey değiştirilmeden önce stop() çağrısı yapar; böylece nesne geçerliliğini korur:
make_account <- function(balance = 0) {
withdraw <- function(x) {
if (x <= 0) stop("amount must be positive", call. = FALSE)
if (x > balance) stop("insufficient funds", call. = FALSE)
balance <<- balance - x
}
list(withdraw = withdraw, balance = function() balance)
}
acc <- make_account(50)
msg <- tryCatch(acc$withdraw(80), error = function(e) conditionMessage(e))
cat(msg, "/", acc$balance())Çıktı:
insufficient funds / 50lockBinding("rate", e) bir ortamın tek bir değişkenini salt okunur yapar. Sonrasında bu değişkene atama yapmak hata verirken diğer değişkenler yazılabilir durumda kalır:
loan <- new.env()
loan$rate <- 0.05
loan$owed <- 1000
lockBinding("rate", loan)
loan$owed <- 900
msg <- tryCatch({ loan$rate <- 0; "changed" }, error = function(e) conditionMessage(e))
cat(msg, "\n")
cat(loan$rate, loan$owed, "\n")Çıktı:
cannot change value of locked binding for 'rate'
0.05 900 lockEnvironment(e) yeni değişkenlerin eklenmesini engeller. bindings = TRUE ile mevcut olanların her birini de kilitler ve tüm nesneyi salt okunur hâle getirir:
cfg <- new.env()
cfg$theme <- "dark"
lockEnvironment(cfg, bindings = TRUE)
for (step in c("change", "add")) {
msg <- tryCatch({
if (step == "change") cfg$theme <- "light" else cfg$size <- 12
"done"
}, error = function(e) conditionMessage(e))
cat(step, ":", msg, "\n")
}Çıktı:
change : cannot change value of locked binding for 'theme'
add : cannot add bindings to a locked environment local() kodu yeni bir ortamda çalıştırır ve son değerini döndürür. İçeride tanımlanan yardımcılar gizli kalır; bu sayede source() diğer her şeyi global ortama yerleştirse bile bir dosya bir işlevi özel tutabilir:
circle_area <- local({
square <- function(x) x * x
function(r) pi * square(r)
})
print(round(circle_area(2), 2))
print(exists("square"))Çıktı:
[1] 12.57
[1] FALSEGörev
Kolaymake_account(owner) factory işlevini Account.R içinde tamamla. Bakiye 0'dan başlar ve özel bir geçmiş, her değişikliği +50 veya -20 olarak kaydeder. Döndürülen liste dört işlev içerir:
deposit(x),x0'dan büyük olmadığı süreceamount must be positivehatasıyla durur;withdraw(x),amount must be positiveveyainsufficient fundshatasıyla durur;balance()bakiyeyi döndürür;history()geçmişi bir karakter vektörü olarak döndürür.
Herhangi bir şeyi değiştirmeden önce kontrol et ve call. = FALSE kullan. Sağlanan kod, sahibi okur; ardından dep 50 veya wd 20 satırlarını işler, her biri için ok ya da error: ve mesajı yazdırır, geçmişin bir kopyasını değiştirmeyi dener ve bakiyeyi ve geçmişi yazdırır.
Kodun Account.R dosyasına yazılmalı. main.R sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
source("Account.R")
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
acc <- make_account(input[1])
for (line in input[-1]) {
p <- strsplit(line, " ")[[1]]
amount <- as.numeric(p[2])
msg <- tryCatch({
if (p[1] == "dep") acc$deposit(amount) else acc$withdraw(amount)
"ok"
}, error = function(e) paste("error:", conditionMessage(e)))
cat(line, ": ", msg, "\n", sep = "")
}
h <- acc$history()
h[1] <- "tampered"
cat("balance: ", acc$balance(), "\n", sep = "")
cat("history: ", paste(acc$history(), collapse = ", "), "\n", sep = "")
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
1S3 Temelleri
Dosyalarla ÇalışmaSınıf ile ListelerYapıcı FonksiyonlarPrint ve Format MetotlarıDoğrulayıcılar ve YardımcılarTekrar - Sıcaklıklar4R'da Kapsülleme
Nesne Olarak Closure'larNesne Olarak OrtamlarErişimci FonksiyonlarDurumu KorumaÖzet - Parkmetre2S3 Generic'leri ve Metotları
Generic'ler ve UseMethodVarsayılan MetotlarTemel Generic'ler için MetotlarNextMethod TemelleriTekrar - Şekil Alanları5S4 Sınıfları
S4 Sınıflarını TanımlamaSlotlar ve ErişimGeçerlilik KontrolleriShow MetotlarıÖzet - Ürün Kataloğu8Referans Sınıfları
Referans Sınıflarını TanımlamaMetotlar ve Alan GüncellemeleriKopyalama SemantiğiKalıtım ve callSuperÖzet - Görev Kuyruğu11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Online R derleyicisi