الإغلاقات ذات الحالة
جزء من قسم المنطق وتدفق التنفيذ في رحلة R على Coddy. الدرس 30 من 64.
داخل دالة، ينشئ <- متغيرًا محليًا. يعيّن العامل <<- القيمة إلى المتغير ذي الاسم نفسه في الدالة المحيطة بدلًا من ذلك، لذا يمكن للإغلاق تحديث قيمة التقطها:
make_counter <- function() {
count <- 0
function() {
count <<- count + 1
count
}
}
next_id <- make_counter()
print(next_id())
print(next_id())
print(next_id())الناتج:
[1] 1
[1] 2
[1] 3لكل عدّاد ينشئه المُنشئ قيمة count الخاصة به، لذا لا يتداخلان مطلقًا:
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())الناتج:
[1] 3
[1] 1باستخدام <- عادي داخل الإغلاق، ينشئ التحديث متغيرًا محليًا جديدًا يختفي بعد كل استدعاء، ولا تتغير القيمة المخزنة أبدًا:
make_broken <- function() {
count <- 0
function() {
count <- count + 1
count
}
}
f <- make_broken()
for (i in 1:2) f()
print(f())الناتج:
[1] 1يمكن لمنشئ أن يُعيد قائمة من الإغلاقات التي تشترك في المتغيرات نفسها. وهي تتصرف معًا ككائن صغير له بياناته الخاصة:
make_wallet <- function(balance) {
list(
add = function(x) balance <<- balance + x,
get = function() balance
)
}
w <- make_wallet(10)
w$add(5)
print(w$get())الناتج:
[1] 15التحدي
سهلأكمل make_counter(). فهي تُعيد دالةً تضيف، في كل مرة يتم استدعاؤها، 1 إلى عدّادها الخاص وتُعيد العدّاد الجديد، بدءًا من 1.
ينشئ الكود المُزوَّد عدّادين، a وb. ويقرأ قائمة مفصولة بفواصل من a وb، ويستدعي العدّاد المطابق لكل إدخال، ويطبع كل قيمة مُعادة في سطر خاص بها.
جرّب بنفسك
make_counter <- function() {
# اكتب الكود الخاص بك هنا
function() 0
}
# كود الإدخال/الإخراج المُزوَّد: أبقه كما هو
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 = "")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1السلاسل النصية بعمق
السلاسل الفرعية باستخدام substr()التنسيق باستخدام sprintf()التقسيم والضمالبحث في السلاسل النصيةاستبدال النصوصمراجعة - منشئ اسم المستخدم4المصفوفات
إنشاء المصفوفاتفهرسة المصفوفاتملخصات الصفوف والأعمدةالحساب على المصفوفاتمراجعة - مخطط المقاعد2استرجاع القيم باستخدام المفاتيح
البحث في المتجهات المُسمّاةالتحقق من المفاتيحإضافة المفاتيح وإزالتهاالتكرار عبر الأسماءمراجعة - مكتب الأسهمتدرّب بنفسك: مترجم R عبر الإنترنت