החזרת פונקציות
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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"אתגר
קלהשלם את 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 = "")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
תת־מחרוזות עם substr()עיצוב עם sprintf()פיצול וחיבורחיפוש במחרוזותהחלפת טקסטסיכום – בונה שמות משתמש4מטריצות
יצירת מטריצותאינדוקס מטריצותסיכומי שורות ועמודותאריתמטיקה של מטריצותסיכום – תרשים מקומות ישיבהתרגלו בעצמכם: קומפיילר R אונליין