Menu
Coddy logo textTech

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] 9

sapply() עושה את אותו הדבר ומפשטת את התוצאה: כשכל קריאה מחזירה ערך אחד, מתקבל וקטור רגיל במקום רשימה:

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

אתגר

קל

השלימו את 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")
quiz iconבחנו את עצמכם

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

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

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