איך יוצרים משתנה ב-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, מה שהופך שמות עם נקודות לדו-משמעיים לקריאה.