סגירות עם מצב
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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מטריצות
יצירת מטריצותאינדוקס מטריצותסיכומי שורות ועמודותאריתמטיקה של מטריצותסיכום – תרשים מקומות ישיבהתרגלו בעצמכם: קומפיילר R אונליין