<<-
durumu korumak için kapaklarla birlikte en kullanışlıdır. İşte son zamanlardaki bir makalemden bir bölüm:
Kapatma, başka bir işlev tarafından yazılan bir işlevdir. Kapaklar , üst işlevin ortamını kapsadıkları ve bu işlevdeki tüm değişkenlere ve parametrelere erişebildikleri için çağrılır . Bu faydalıdır çünkü iki parametre seviyesine sahip olmamızı sağlar. Bir düzey parametre (üst öğe) işlevin nasıl çalıştığını kontrol eder. Diğer seviye (çocuk) işi yapar. Aşağıdaki örnek, bir güç işlevleri ailesi oluşturmak için bu fikri nasıl kullanabileceğinizi gösterir. Ana işlev ( power
) , gerçekten zor işi yapan alt işlevler ( square
ve ) oluşturur cube
.
power <- function(exponent) {
function(x) x ^ exponent
}
square <- power(2)
square(2) # -> [1] 4
square(4) # -> [1] 16
cube <- power(3)
cube(2) # -> [1] 8
cube(4) # -> [1] 64
Değişkenleri iki düzeyde yönetme özelliği, bir işlevin üst öğesinin ortamındaki değişkenleri değiştirmesine izin vererek işlev çağrıları arasında durumun korunmasını da mümkün kılar. Değişkenleri farklı seviyelerde yönetmenin anahtarı çift oklu atama operatörüdür <<-
. Her <-
zaman geçerli düzeyde çalışan olağan tek ok atamasının ( ) aksine, çift ok operatörü üst düzeylerdeki değişkenleri değiştirebilir.
Bu, aşağıdaki örnekte gösterildiği gibi, bir işlevin kaç kez çağrıldığını kaydeden bir sayacı korumayı mümkün kılar. Her new_counter
çalıştırıldığında, bir ortam oluşturur i
, bu ortamdaki sayacı başlatır ve sonra yeni bir işlev oluşturur.
new_counter <- function() {
i <- 0
function() {
# do something useful, then ...
i <<- i + 1
i
}
}
Yeni işlev bir kapak ve çevresi kapalı ortamdır. Kapaklar counter_one
ve counter_two
çalıştırıldığında, her biri sayacı çevreleyen ortamda değiştirir ve geçerli sayımı döndürür.
counter_one <- new_counter()
counter_two <- new_counter()
counter_one() # -> [1] 1
counter_one() # -> [1] 2
counter_two() # -> [1] 1