Menu
Coddy logo textTech

העברת פונקציות

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 28 מתוך 64.

פונקציה יכולה לקבל פונקציה אחרת כארגומנט ולקרוא לה. apply_twice() שלהלן פועלת עם כל פונקציה שמקבלת ארגומנט אחד:

apply_twice <- function(f, x) f(f(x))
print(apply_twice(\(x) x + 3, 10))
print(apply_twice(toupper, "ok"))

פלט:

[1] 16
[1] "OK"

פונקציות מובנות כגון sum, max או toupper הן גם ערכים, לכן מעבירים אותן לפי שמן, ללא סוגריים. עם סוגריים, הן היו מופעלות במקום זאת:

summarize <- function(xs, how) how(xs)
print(summarize(c(4, 9, 2), max))
print(summarize(c(4, 9, 2), sum))

פלט:

[1] 9
[1] 15

פונקציה שמקבלת פרדיקט, פונקציה שמחזירה TRUE או FALSE, יכולה לספור או לבחור ערכים לפי כל כלל:

count_if <- function(xs, keep) {
  n <- 0
  for (x in xs) if (keep(x)) n <- n + 1
  n
}
print(count_if(c(3, 8, 10, 5), \(x) x %% 2 == 0))
print(count_if(c(3, 8, 10, 5), \(x) x > 4))

פלט:

[1] 2
[1] 3

הקורא מחליט על ההתנהגות, והפונקציה מספקת את הלולאה, כך שפונקציה אחת מתאימה למקרים רבים:

transform_each <- function(xs, f) {
  out <- c()
  for (x in xs) out <- c(out, f(x))
  out
}
print(transform_each(1:4, \(x) x * 10))
print(transform_each(c("a", "b"), toupper))

פלט:

[1] 10 20 30 40
[1] "A" "B"
challenge icon

אתגר

קל

השלימו את apply_n(f, x, n). קראו ל־f עם x, ואז עם התוצאה, בסך הכול n פעמים, והחזירו את הערך הסופי. כאשר n הוא 0, החזירו את x ללא שינוי.

הקוד שסופק מגדיר שלוש פונקציות: double, inc ו־half. הוא קורא את השם של אחת מהן, את ערך ההתחלה ואת n, ומדפיס את התוצאה של apply_n().

נסו בעצמכם

apply_n <- function(f, x, n) {
  # כתבו את הקוד שלכם כאן
  x
}

# קוד קלט/פלט שסופק: השאירו אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
ops <- list(double = \(x) x * 2, inc = \(x) x + 1, half = \(x) x / 2)
cat(apply_n(ops[[input[1]]], as.numeric(input[2]), as.numeric(input[3])), sep = "\n")
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר R אונליין