Menu
CoddyTech

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

חלק מהיחידה יסודות במסלול ה-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 אונליין