פונקציות אנונימיות
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 27 מתוך 64.
ב-R פונקציה היא ערך כמו מספר או מחרוזת. function(x) x * 2 יוצר פונקציה בלי לתת לה שם, והערך של הביטוי האחרון שלה הוא הערך שהיא מחזירה:
double <- function(x) x * 2
print(double(21))
print((function(x) x + 1)(9))פלט:
[1] 42
[1] 10R 4.1 הוסיפה צורה מקוצרת: \(x) פירושו אותו דבר כמו function(x). השתמשו בסוגריים מסולסלים כשהגוף דורש כמה שורות:
square <- \(x) x^2
label <- function(x) {
size <- if (x > 10) "big" else "small"
paste(x, "is", size)
}
print(square(4))
print(label(12))פלט:
[1] 16
[1] "12 is big"מכיוון שפונקציות הן ערכים, רשימה יכולה להכיל כמה מהן תחת שמות. ops[["inc"]] היא פונקציה, לכן ops[["inc"]](5) קוראת לה:
ops <- list(inc = \(x) x + 1, neg = \(x) -x)
print(ops[["inc"]](5))
print(names(ops))פלט:
[1] 6
[1] "inc" "neg"פונקציה יכולה לקבל כמה ארגומנטים ולתת לחלק מהם ערכי ברירת מחדל, בדיוק כמו פונקציה בעלת שם:
area <- \(w, h = w) w * h
print(area(3))
print(area(3, 5))פלט:
[1] 9
[1] 15אתגר
קלהשלימו את הרשימה ops בשלוש פונקציות אנונימיות המקבלות ארגומנט אחד:
doubleמחזירה את הארגומנט כפול 2squareמחזירה את הארגומנט כפול עצמוnegateמחזירה את הארגומנט עם סימן הפוך
הקוד שסופק קורא את שם הפעולה ומספר, קורא לפונקציה המתאימה מתוך ops ומדפיס את התוצאה.
נסו בעצמכם
ops <- list(
# כתבו את הקוד שלכם כאן
double = function(x) x
)
# קוד קלט/פלט שסופק: השאירו אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
f <- ops[[input[1]]]
cat(f(as.numeric(input[2])), sep = "\n")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
תת־מחרוזות עם substr()עיצוב עם sprintf()פיצול וחיבורחיפוש במחרוזותהחלפת טקסטסיכום – בונה שמות משתמש4מטריצות
יצירת מטריצותאינדוקס מטריצותסיכומי שורות ועמודותאריתמטיקה של מטריצותסיכום – תרשים מקומות ישיבהתרגלו בעצמכם: קומפיילר R אונליין