Menu
Coddy logo textTech

Map ו-mapply

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

Map(f, xs, ys) עובר על שני וקטורים או יותר במקביל וקורא ל־f עם איבר אחד מכל וקטור: תחילה עם האיברים הראשונים, לאחר מכן עם האיברים השניים, וכן הלאה. הוא מחזיר רשימה:

totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])

פלט:

[1] 3
[1] 7.5

mapply() היא הגרסה המצמצמת, כמו sapply() עבור כמה וקטורים. unlist() גם משטחת את הרשימה מ-Map() לווקטור:

print(mapply(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5)))
print(unlist(Map(function(a, b) a + b, 1:3, 4:6)))

פלט:

[1]  8.0 12.0  7.5
[1] 5 7 9

הווקטורים מותאמים לפי מיקום, ולכן חייב להיות להם אותו אורך. mapply() נותנת לתוצאות טקסט שמות לפי הווקטור הראשון; USE.NAMES = FALSE מסיר את השמות:

items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)

פלט:

[1] "2 x tea" "3 x jam"

כשכל זוג דורש if, כתבו פונקציה עם כמה ארגומנטים והעבירו אותה אל mapply(). התנאי רץ פעם אחת עבור כל זוג:

describe <- function(name, age) {
  group <- if (age < 18) "minor" else "adult"
  paste0(name, " (", group, ")")
}
print(mapply(describe, c("Ada", "Tim"), c(36, 12), USE.NAMES = FALSE))

פלט:

[1] "Ada (adult)" "Tim (minor)"
challenge icon

אתגר

קל

השלימו את order_lines(items, qty, prices). החזירו שורה אחת לכל פריט, 2 x tea = 8.00: הכמות, x , הפריט, = והכמות כפול המחיר עם שתי ספרות אחרי הנקודה העשרונית. השתמשו ב־mapply() או ב־Map().

הקוד שסופק קורא את הפריטים, את הכמויות ואת המחירים בשלוש שורות המופרדות בפסיקים, ומדפיס כל שורה שהוחזרה.

נסו בעצמכם

order_lines <- function(items, qty, prices) {
  # כתבו כאן את הקוד שלכם
  character(0)
}

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

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

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

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