Menu
Coddy logo textTech

Durum Bilgili Closure'lar

Coddy'nin R Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 30 / 64.

Bir fonksiyonun içinde <- yerel bir değişken oluşturur. <<- operatörü bunun yerine, aynı ada sahip kapsayan fonksiyondaki değişkene atama yapar; böylece bir closure, yakaladığı bir değeri güncelleyebilir:

make_counter <- function() {
  count <- 0
  function() {
    count <<- count + 1
    count
  }
}
next_id <- make_counter()
print(next_id())
print(next_id())
print(next_id())

Çıktı:

[1] 1
[1] 2
[1] 3

Üretici tarafından oluşturulan her sayaç kendi count değerine sahiptir, bu nedenle birbirlerini asla etkilemezler:

make_counter <- function() {
  count <- 0
  function() {
    count <<- count + 1
    count
  }
}
a <- make_counter()
b <- make_counter()
for (i in 1:2) a()
print(a())
print(b())

Çıktı:

[1] 3
[1] 1

Kapanış içinde düz bir <- kullanıldığında, güncelleme her çağrıdan sonra ortadan kaybolan yeni bir yerel değişken oluşturur ve depolanan değer hiç değişmez:

make_broken <- function() {
  count <- 0
  function() {
    count <- count + 1
    count
  }
}
f <- make_broken()
for (i in 1:2) f()
print(f())

Çıktı:

[1] 1

Bir üretici, aynı değişkenleri paylaşan bir kapanışlar listesi döndürebilir. Birlikte, kendine ait verileri olan küçük bir nesne gibi davranırlar:

make_wallet <- function(balance) {
  list(
    add = function(x) balance <<- balance + x,
    get = function() balance
  )
}
w <- make_wallet(10)
w$add(5)
print(w$get())

Çıktı:

[1] 15
challenge icon

Görev

Kolay

make_counter() işlevini tamamla. Bu işlev, her çağrıldığında kendi sayacına 1 ekleyen ve 1’den başlayarak yeni sayacı döndüren bir işlev döndürür.

Sağlanan kod, a ve b olmak üzere iki sayaç oluşturur. Virgülle ayrılmış bir a ve b listesi okur, her girdi için eşleşen sayacı çağırır ve döndürülen her değeri kendi satırına yazdırır.

Kendin dene

make_counter <- function() {
  # Kodunuzu buraya yazın
  function() 0
}

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
counters <- list(a = make_counter(), b = make_counter())
for (k in strsplit(input[1], ",")[[1]]) cat(counters[[k]](), "\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.

Mantık ve Akış bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi