Nesne Olarak Ortamlar
Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 18 / 57.
Bir ortam, new.env() ile oluşturulan liste gibi adlandırılmış değerler kümesidir. Fark şu ki bir ortam asla kopyalanmaz: ona başvuran her değişken aynı nesneyi görür, bu nedenle bir ad üzerinden yapılan değişiklik tüm adlar üzerinden görülebilir:
e <- new.env()
e$count <- 1
alias <- e
alias$count <- 99
print(e$count)
l <- list(count = 1)
copy <- l
copy$count <- 99
print(l$count)Çıktı:
[1] 99
[1] 1Bir ortam alan bir işlev, çağıranın nesnesini değiştirir. Herhangi bir şey döndürmesi gerekmez ve çağıran bir sonuç atamaz:
deposit <- function(acc, x) acc$balance <- acc$balance + x
acc <- new.env()
acc$balance <- 10
deposit(acc, 5)
deposit(acc, 5)
print(acc$balance)Çıktı:
[1] 20assign(), get() ve exists() bir değişkende tutulan adla çalışır; ls() ise bir ortamda bulunan adları sıralanmış düzende listeler:
e <- new.env()
for (fruit in c("pear", "apple")) assign(fruit, nchar(fruit), envir = e)
print(ls(e))
print(get("pear", envir = e))
print(exists("kiwi", envir = e))Çıktı:
[1] "apple" "pear"
[1] 4
[1] FALSEclass özniteliğine sahip bir ortam, başvuru semantiğine sahip bir S3 nesnesidir: yöntemleri her zamanki gibi çalışır ve onu değiştiren işlevler değişiklikleri yerinde yapar:
new_wallet <- function(coins = 0) {
w <- new.env()
w$coins <- coins
class(w) <- "wallet"
w
}
print.wallet <- function(x, ...) {
cat("wallet with", x$coins, "coins\n")
invisible(x)
}
spend <- function(w, n) w$coins <- w$coins - n
w <- new_wallet(10)
spend(w, 3)
wÇıktı:
wallet with 7 coinsGörev
KolayBir envanter, tek bir değişkeni olan, stok bilgilerini içeren adlandırılmış sayısal bir vektör olan items'a sahip inventory sınıfında bir ortamdır. Inventory.R dosyasını tamamlayın:
new_inventory(), boş biritems(c()kullanılabilir) ve sınıf ile ortamı oluşturur.add_stock(inv, item, n), yeni bir öğe için 0'dan başlayarak öğenin stokunanekler.take_stock(inv, item, n), yeterli stok olduğundanmiktarını çıkarır veTRUEdöndürür; aksi takdirde hiçbir şeyi değiştirmez veFALSEdöndürür.stock_of(inv, item), bilinmeyen bir öğe için 0 olmak üzere stok miktarını döndürür.
Fonksiyonlar envanteri yerinde değiştirir ve envanteri döndürmez. Sağlanan kod, add apple 5 ve take apple 2 komutlarını okur, her take işleminin sonucunu yazdırır, ardından her öğeyi alfabetik sırayla yazdırır.
Kodunuz Inventory.R dosyasına yazılmalıdır. main.R dosyası sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
source("Inventory.R")
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
inv <- new_inventory()
for (line in input) {
p <- strsplit(line, " ")[[1]]
n <- as.numeric(p[3])
if (p[1] == "add") add_stock(inv, p[2], n)
if (p[1] == "take") cat("take ", p[2], ": ", if (take_stock(inv, p[2], n)) "ok" else "not enough", "\n", sep = "")
}
for (item in sort(names(inv$items))) cat(item, ": ", stock_of(inv, item), "\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