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