lapply ו-sapply
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 32 מתוך 64.
lapply(x, f) קוראת ל־f עבור כל איבר של x ומחזירה את התוצאות ברשימה, איבר אחד לכל קלט:
squares <- lapply(1:3, function(i) i^2)
print(length(squares))
print(squares[[3]])פלט:
[1] 3
[1] 9sapply() עושה את אותו הדבר ומפשטת את התוצאה: כשכל קריאה מחזירה ערך אחד, מתקבל וקטור רגיל במקום רשימה:
print(sapply(1:3, function(i) i^2))
print(sapply(c(4, 9, 16), sqrt))פלט:
[1] 1 4 9
[1] 2 3 4עבור וקטור של תווים, sapply() מעניקה לתוצאות שמות לפי הקלטים. הוסיפו USE.NAMES = FALSE כדי לקבל וקטור פשוט:
words <- c("tea", "coffee")
print(sapply(words, nchar))
print(sapply(words, nchar, USE.NAMES = FALSE))פלט:
tea coffee
3 6
[1] 3 6הפונקציות האלה מחליפות את הלולאה שבונה תוצאה, איבר אחד בכל פעם. שתי הגרסאות שלהלן מחשבות כמה תנועות יש בכל מילה:
words <- c("banana", "sky", "idea")
vowels <- function(w) sum(strsplit(w, "")[[1]] %in% c("a", "e", "i", "o", "u"))
counts <- c()
for (w in words) counts <- c(counts, vowels(w))
print(counts)
print(sapply(words, vowels, USE.NAMES = FALSE))פלט:
[1] 3 0 3
[1] 3 0 3אתגר
קלהשלימו את vowel_counts(words). החזירו שורה אחת לכל מילה, banana: 3, עם מספר התנועות (a, e, i, o, u) במילה. השתמשו ב־sapply() כדי לספור את התנועות בכל המילים.
הקוד שסופק קורא את המילים כשורה המופרדת בפסיקים של מילים באותיות קטנות ומדפיס כל שורה שהוחזרה.
נסו בעצמכם
vowel_counts <- function(words) {
# כתבו את הקוד שלכם כאן
character(0)
}
# קוד קלט/פלט שסופק: השאירו אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
cat(vowel_counts(strsplit(input[1], ",")[[1]]), sep = "\n")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
תת־מחרוזות עם substr()עיצוב עם sprintf()פיצול וחיבורחיפוש במחרוזותהחלפת טקסטסיכום – בונה שמות משתמש4מטריצות
יצירת מטריצותאינדוקס מטריצותסיכומי שורות ועמודותאריתמטיקה של מטריצותסיכום – תרשים מקומות ישיבהתרגלו בעצמכם: קומפיילר R אונליין