Menu
CoddyTech

החזרת פונקציות

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

פונקציה יכולה גם להחזיר פונקציה. make_multiplier(3) מחזירה פונקציה חדשה שמכפילה את הארגומנט שלה ב-3:

make_multiplier <- function(n) {
  function(x) x * n
}
triple <- make_multiplier(3)
print(triple(5))
print(make_multiplier(10)(5))

פלט:

[1] 15
[1] 50

הפונקציה המוחזרת זוכרת את הערכים שאיתם נבנתה. השילוב הזה של פונקציה והמשתנים שסביבה נקרא סגירה. כל קריאה לפונקציה היוצרת בונה סגירה נפרדת:

make_greeter <- function(greeting) {
  function(name) paste0(greeting, ", ", name, "!")
}
hello <- make_greeter("Hello")
hola <- make_greeter("Hola")
print(hello("Ada"))
print(hola("Ada"))

פלט:

[1] "Hello, Ada!"
[1] "Hola, Ada!"

פונקציית ייצור הופכת כמה הגדרות לכלי מוכן לשימוש, למשל ממיר בין יחידות:

make_converter <- function(factor, offset = 0) {
  function(x) x * factor + offset
}
c_to_f <- make_converter(1.8, 32)
km_to_miles <- make_converter(0.621)
print(c_to_f(100))
print(km_to_miles(10))

פלט:

[1] 212
[1] 6.21

אפשר לשלב פונקציות לפונקציות חדשות. compose(f, g) מחזירה פונקציה שמריצה את f ואז את g:

compose <- function(f, g) function(x) g(f(x))
clean <- compose(trimws, toupper)
print(clean("  hi there "))

פלט:

[1] "HI THERE"
challenge icon

אתגר

קל

השלימו את make_formatter(prefix, digits). היא מחזירה פונקציה שמקבלת מספר ומחזירה את prefix ואחריו את המספר עם digits ספרות עשרוניות: make_formatter("$", 2)(3.5) מחזירה $3.50.

sprintf("%.*f", digits, x) מעצבת את x עם digits ספרות עשרוניות.

הקוד שסופק קורא את הקידומת, את מספר הספרות העשרוניות ואת רשימת המספרים המופרדת בפסיקים. הוא יוצר מעצב אחד ומדפיס את התוצאה שלו עבור כל מספר.

נסו בעצמכם

make_formatter <- function(prefix, digits) {
  # כתבו כאן את הקוד שלכם
  function(x) ""
}

# קוד הקלט/פלט שסופק: השאירו אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
fmt <- make_formatter(input[1], as.integer(input[2]))
for (x in as.numeric(strsplit(input[3], ",")[[1]])) cat(fmt(x), "\n", sep = "")
quiz iconבחנו את עצמכם

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

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

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