Menu
Coddy logo textTech

גישה לאיברי רשימה

חלק מהיחידה יסודות במסלול ה-R של Coddy. שיעור 72 מתוך 78.

ברשימות משתמשים בתחביר שונה לגישה לאיברים בהשוואה לווקטורים. ההבדל העיקרי הוא בין סוגריים מרובעים יחידים [ ] לסוגריים מרובעים כפולים [[ ]].

סוגריים מרובעים כפולים שולפים את האיבר עצמו מתוך הרשימה:

my_list <- list(42, "hello", TRUE)
print(my_list[[1]])

פלט:

[1] 42

סוגריים יחידים מחזירים תת־רשימה שמכילה את האיבר, ולא את האיבר עצמו:

my_list <- list(42, "hello", TRUE)
print(my_list[1])

פלט:

[[1]]
[1] 42

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

my_list <- list(c(10, 20, 30), "text")
print(my_list[[1]][2])

פלט:

[1] 20

כאן, my_list[[1]] מאחזר את הווקטור, ו-[2] ניגש לאיבר השני שלו. זכרו: השתמשו ב-[[ ]] כשאתם צריכים את התוכן עצמו, וב-[ ] כשרוצים רשימה קטנה יותר.

challenge icon

אתגר

קל

תקבלו שתי שורות קלט:

  1. שלושה ערכים מסוגים שונים, מופרדים בפסיקים (לדוגמה, 100,hello,TRUE)
  2. רשימת מספרים המופרדים בפסיקים, המייצגים וקטור שיישמר כאיבר הרביעי (לדוגמה, 5,10,15,20)

בצעו את הפעולות הבאות:

  1. צרו רשימה עם ארבעה איברים: הערך המספרי, הטקסט, הערך הלוגי ווקטור המספרים
  2. השתמשו בסוגריים מרובעים כפולים כדי לחלץ ולהדפיס את האיבר השני (ערך הטקסט)
  3. השתמשו בסוגריים מרובעים יחידים כדי לחלץ את האיבר השלישי ולהדפיס את התוצאה (שימו לב להבדל בפורמט הפלט)
  4. גשו לווקטור השמור באיבר הרביעי באמצעות סוגריים מרובעים כפולים, ואז חלצו והדפיסו את הערך השלישי שלו באמצעות אינדוקס של וקטור
  5. הדפיסו את סכום כל המספרים באיבר הרביעי (גשו לווקטור באמצעות סוגריים מרובעים כפולים והשתמשו ב-sum())

לדוגמה, אם הקלט הוא:

42,world,FALSE
8,16,24,32,40

הפלט צריך להיות:

[1] "world"
[[1]]
[1] FALSE

[1] 24
[1] 120

הסבר:

  • my_list[[2]] מחלץ את ערך הטקסט עצמו: "world"
  • my_list[3] מחזיר תת-רשימה שמכילה את FALSE (שימו לב ל-[[1]] בפלט)
  • my_list[[4]][3] ניגש לווקטור ואז מקבל את האיבר השלישי שלו: 24
  • sum(my_list[[4]]) מחשב 8+16+24+32+40 = 120

נסו בעצמכם

# קראו את הקלט
con <- file("stdin", "r")
input1 <- suppressWarnings(readLines(con, n = 1))  # שורה ראשונה: שלושה ערכים המופרדים בפסיקים
input2 <- suppressWarnings(readLines(con, n = 1))  # שורה שנייה: מספרים המופרדים בפסיקים עבור וקטור
close(con)

# פצלו את שורת הקלט הראשונה לערכים נפרדים
values <- strsplit(input1, ",")[[1]]
numeric_val <- as.numeric(values[1])
text_val <- values[2]
logical_val <- as.logical(values[3])

# פצלו את שורת הקלט השנייה לווקטור מספרי
vector_val <- as.numeric(strsplit(input2, ",")[[1]])

# TODO: כתבו את הקוד שלכם למטה
# 1. צרו רשימה עם ארבעה איברים: numeric_val, text_val, logical_val ו־vector_val
# 2. השתמשו בסוגריים מרובעים כפולים [[ ]] כדי לחלץ ולהדפיס את האיבר השני
# 3. השתמשו בסוגריים מרובעים יחידים [ ] כדי לחלץ את האיבר השלישי ולהדפיס אותו
# 4. גשו לאיבר הרביעי באמצעות סוגריים מרובעים כפולים, ואז חלצו את הערך השלישי שלו
# 5. הדפיסו את סכום כל המספרים באיבר הרביעי
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה יסודות

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