Menu
Coddy logo textTech

פונקציות אנונימיות

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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] 10

R 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
challenge icon

אתגר

קל

השלימו את הרשימה ops בשלוש פונקציות אנונימיות המקבלות ארגומנט אחד:

  • double מחזירה את הארגומנט כפול 2
  • square מחזירה את הארגומנט כפול עצמו
  • 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")
quiz iconבחנו את עצמכם

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

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

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