Menu

משתנים והשמה ב-R: <-, = ו-assign()

איך יוצרים משתנים ב-R עם החץ <-, מתי דווקא צריך =, כללי מתן השמות, ואיך מציגים ומוחקים משתנים עם ls() ו-rm().

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

איך יוצרים משתנה ב-R

משתנה ב-R הוא שם שמוצמד לערך. יוצרים אותו עם חץ ההשמה <-: השם בא לפני החץ, והערך אחריו.

שלושה משתנים, שלושה סוגי ערכים שונים, ואף הצהרת סוג בשום מקום: R מסיקה את הסוג מתוך הערך עצמו (עוד על כך ב-סוגי נתונים). ברגע שמשתנה קיים, משתמשים בו בכל מקום שבו הייתם משתמשים בערך:

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

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

למה R משתמשת ב-<- במקום =

הנה השאלה שכולם שואלים: גם age = 30 עובד, אז למה כל ספר R, כל מדריך סגנון וכל חבילה משתמשים בחץ?

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

אם הייתם מנסים mean(values, na.rm <- TRUE), הייתם יוצרים בטעות משתנה גלובלי בשם na.rm ומעבירים TRUE לפי מיקום: חוקי, שגוי, וקשה לזיהוי. המוסכמה ששומרת על הקוד קריא פשוטה:

  • <- תמיד פירושו השמה.
  • = תמיד פירושו "הארגומנט הזה מקבל את הערך הזה" בתוך קריאה ל-פונקציה.

הקפידו על החלוקה הזאת, וכל שורת R שתקראו תגיד לכם במבט אחד אם משהו נוצר או מועבר. זה כלל הסגנון האוניברסלי ביותר בעולם של R: RStudio אפילו נותנת ל-<- קיצור מקלדת משלו (Alt+-).

בני הדודים הנדירים: ->, = ו-assign()

ל-R יש עוד שתי דרכים לבצע השמה, ושווה לזהות את שתיהן גם אם כמעט לא תכתבו אותן.

החץ ההפוך -> מבצע השמה בכיוון השני: הערך קודם, השם בסוף:

לפעמים תראו אותו בסוף שרשרת ארוכה ("חשב את כל זה, ואז שמור"), אבל רוב מדריכי הסגנון אומרים להימנע ממנו: קוראים סורקים את תחילת השורה כדי למצוא את השם שמוגדר.

assign() יוצרת משתנה מתוך מחרוזת, כלומר אפשר לבנות את השם בזמן ריצה:

זה נראה מתוחכם, וכמעט תמיד זה הכלי הלא נכון: קבוצה של משתנים ממוספרים היא בעצם וקטור או רשימה בתחפושת. פנו ל-assign() רק כשבאמת חייבים לחשב שם; בת הזוג שלה, get("score"), קוראת משתנה לפי שם במחרוזת.

כללי מתן שמות

R מקבלת שמות ש:

  • מכילים אותיות, ספרות, נקודות (.) וקווים תחתונים (_).
  • מתחילים באות, או בנקודה שלא באה אחריה ספרה.
  • אינם מילים שמורות (if, for, TRUE, NULL, function ועוד כמה).

כך שכל אלה תקינים:

ואלה לא:

  • 2nd_user: אי אפשר להתחיל בספרה.
  • _temp: גם בקו תחתון אי אפשר להתחיל (בניגוד ל-Python).
  • user-name: מקף הוא חיסור, לא תו של שם.
  • TRUE: מילה שמורה.

שמות רגישים לאותיות גדולות וקטנות: total, Total ו-TOTAL הם שלושה משתנים שאין ביניהם קשר, ו-R לא תזהיר אתכם כשתיצרו אחד מהם בטעות הקלדה.

הצגה ומחיקה: ls() ו-rm()

כל משתנה שיוצרים נוחת בסביבת העבודה (הסביבה הגלובלית). ls() מציגה מה יש שם, ו-rm() מסירה דברים:

שני פרטים שכדאי להכיר. ראשית, rm(list = ls()) מוחקת את כל סביבת העבודה: שימושי בתחילת סשן חקירה, הרסני בכל מקום אחר. שנית, שמות שמתחילים בנקודה (כמו .cache) מוסתרים מ-ls() אלא אם קוראים ל-ls(all.names = TRUE): אותה מוסכמה כמו קבצים מוסתרים ב-Unix.

מוסכמות שמות: השתמשו ב-snake_case

מעבר לכללים הנוקשים, קהילת R המודרנית (ומדריך הסגנון של tidyverse) התיישבה על מוסכמות:

  • lower_snake_case למשתנים ולפונקציות: retry_count, fit_model.
  • נקודות בשמות חוקיות אבל מיושנות: R הבסיסית מלאה בשמות מתקופת data.frame כמו my.data, אבל לנקודות יש גם משמעות במערכת המתודות S3 של R (print.data.frame הוא "מתודת ההדפסה של data frames"), ולכן קוד חדש נמנע מהן.
  • בלי קידומות הונגריות, בלי camelCase: תראו camelCase בחבילות ישנות, אבל snake_case הוא המקום שבו האקוסיסטם התייצב.
  • אין ב-R קבועים אמיתיים; המוסכמה היא לתת לקבועים לכאורה שמות באותיות גדולות (MAX_RETRIES <- 5) ופשוט לא לבצע להם השמה מחדש.

בחרו שמות תיאוריים והקפידו על עקביות. avg_score עולה ארבע הקשות יותר מ-as וחוסך לכל קורא עתידי טיול חזרה למעלה בסקריפט.

מה לקחת מכאן

  • name <- value יוצר משתנה; הקהילה שומרת את = לארגומנטים של פונקציות.
  • -> ו-assign() קיימים; תקראו אותם יותר ממה שכדאי לכתוב אותם.
  • שמות משתמשים באותיות, ספרות, נקודות וקווים תחתונים; הם לא יכולים להתחיל בספרה או בקו תחתון, והם רגישים לאותיות גדולות וקטנות.
  • ls() מציגה את סביבת העבודה, rm() מנקה אותה.
  • כתבו ב-snake_case והקוד שלכם ייראה כמו ה-R שכולם כותבים היום.

הבא בתור: אילו סוגי ערכים המשתנים האלה מחזיקים בפועל. numeric, integer, character ו-logical.

שאלות נפוצות

איך יוצרים משתנה ב-R?

כותבים את השם, את חץ ההשמה <- ואת הערך: age <- 30. R מסיקה את הסוג מתוך הערך, אין שלב של הצהרה. גם age = 30 עובד ברמה העליונה, אבל המוסכמה בקהילה היא <-.

מה ההבדל בין <- ל-= ב-R?

ברמה העליונה של סקריפט הם עושים אותו דבר. בתוך קריאה לפונקציה לא: mean(x, na.rm = TRUE) משתמש ב-= כדי להתאים ארגומנט לפי שם, לא כדי ליצור משתנה. מכיוון ש-= ממלא את שני התפקידים בהתאם להקשר, מדריכי הסגנון של R שומרים את <- להשמה ואת = לארגומנטים.

איך מוחקים משתנה ב-R?

rm(x) מסירה את המשתנה x מסביבת העבודה. rm(list = ls()) מסירה הכול: שימושי כדי להתחיל מדף נקי, מסוכן באמצע ניתוח. ls() מציגה מה קיים כרגע.

האם שמות משתנים ב-R יכולים להכיל נקודות?

כן: my.data הוא שם חוקי לגמרי, וקוד R ישן משתמש בנקודות בכל מקום. הסגנון המודרני מעדיף קווים תחתונים (my_data), כי לנקודות יש גם משמעות במערכת המתודות S3 של R, מה שהופך שמות עם נקודות לדו-משמעיים לקריאה.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל