ביטויים והדפסה אוטומטית
R היא שפת ביטויים: כמעט כל שורה שכותבים מפיקה ערך. בקונסולה, ביטוי שמוקלד לבדו מחושב והערך שלו מודפס אוטומטית, בלי צורך ב-print():
לפני כל תוצאה מופיע [1]: זו R שמציינת את המיקום של הערך הראשון שמוצג, רמז ראשון לכך ש-R חושבת בווקטורים (עוד על כך בהמשך). להדפסה האוטומטית יש מלכוד שכדאי להכיר כבר ביום הראשון: היא חלה על ביטויים חשופים ברמה העליונה. אותו ביטוי בתוך גוף של פונקציה או בתוך לולאת for לא מדפיס כלום, ולכן סקריפטים משתמשים ב-cat() או ב-print() מפורשים לפלט שחייבים לראות.
השמה: החץ
אופרטור ההשמה של R הוא <-, חץ שמצביע על השם שמקבל את הערך:
קראו את radius <- 5 כ"radius מקבל 5". כן, גם = עובד להשמה ברמה העליונה, וכן, מתחילים שואלים למה מישהו מקליד שני תווים במקום אחד. התשובה היא מוסכמה עם שיניים: כל מדריכי הסגנון הגדולים, התיעוד של R הבסיסית, ולמעשה כל קוד R שתקראו אי פעם משתמשים ב-<- להשמה, ושומרים את = לתפקיד אחד מסוים: מתן שמות לארגומנטים בתוך קריאות לפונקציות (בסעיף הבא). כשמקפידים על המוסכמה, שתי הפעולות נראות שונות לעין. ב-RStudio, Alt+- (Option+- ב-macOS) מקליד את החץ בשבילכם.
שימו לב שהשמה לא מודפסת אוטומטית: area <- 78.5 שומר את הערך בשקט. לכן הקטע למעלה צריך את ה-print().
רגישות לאותיות גדולות וקטנות
R רגישה לחלוטין לאותיות גדולות וקטנות, גם בשמות שאתם יוצרים וגם בשמות שהשפה מספקת:
שני משתנים שונים. באותו אופן, mean() היא פונקציה ו-Mean() לא קיימת. כש-R מקבלת את פניכם עם object 'x' not found או could not find function, בדקו את האותיות הגדולות לפני כל דבר אחר: זו השגיאה הנפוצה ביותר אצל מתחילים.
קריאות לפונקציות וארגומנטים בעלי שם
קוראים לפונקציות עם סוגריים, והארגומנטים מופרדים בפסיקים. אפשר להתאים ארגומנטים לפי מיקום, לפי שם, או בשילוב:
הקריאה ל-seq() מדגימה את תחביר הארגומנטים בעלי השם של R, וכאן = מצדיק את קיומו: בתוך קריאה, name = value נותן תווית לארגומנט. ארגומנטים בעלי שם פוטרים אתכם מלזכור את סדר הפרמטרים, והם הופכים קריאות למתעדות את עצמן; seq(0, 100, 25) עובד בדיוק אותו דבר אבל אומר לקורא פחות. המוסכמה המקובלת: העבירו את הארגומנט הראשון (בדרך כלל הנתונים) לפי מיקום, ותנו שמות לשאר.
עזרה על כל פונקציה נמצאת במרחק הקשה אחת: ?seq בקונסולה פותח את התיעוד שלה.
הכול וקטור
הרעיון שגורם ל-R להרגיש שונה משפות אחרות: אין מספרים בודדים חשופים. אפילו 5 הוא וקטור באורך אחד, ופעולות חלות איבר אחר איבר על וקטורים שלמים:
אין לולאה בשום מקום, ובכל זאת כל איבר הומר. ברוב השפות אלה שלוש איטרציות של לולאת for; ב-R זו אריתמטיקה. זו וקטוריזציה, והיא מעצבת הכול: אופרטורי השוואה, פונקציות של מחרוזות ופונקציות מתמטיות עובדים כולם כך. זו הסיבה שב-R אידיומטית יש הרבה פחות לולאות ממה שהייתם מצפים; הסיפור המלא נמצא ב-וקטורים.
סוגריים מסולסלים ובלוקים
גופים של כמה שורות, עבור if, לולאות ופונקציות, מקובצים בסוגריים מסולסלים {}:
שני דברים לשים לב אליהם. התנאי נמצא בסוגריים, וזה if רגיל, לא if: ולא if ... then. ובניגוד ל-Python, להזחה אין שום משמעות ב-R: הסוגריים המסולסלים מגדירים את הבלוק, וההזחה היא בשביל בני אדם. דילוג על סוגריים מסולסלים בשורה אחת הוא חוקי, אבל מקור קלאסי לבאגים בזמן עריכה; פשוט השתמשו בהם תמיד.
רווחים ונקודה-פסיק
R מתעלמת מרווחים עודפים, וירידת שורה מסיימת פקודה, בלי צורך בנקודה-פסיק:
הפיצול לשתי שורות עובד כי שורה 3 מסתיימת ב-+, ולכן R יודעת שהביטוי לא הסתיים. זה הכלל היחיד שצריך לזכור כששוברים שורות ארוכות: שברו אחרי אופרטור או פסיק, אף פעם לא לפניו, אחרת R תתייחס לשורה הראשונה כשלמה. נקודה-פסיק קיימת רק כדי לדחוס שתי פקודות לשורה אחת (a <- 1; b <- 2): חוקי, לא מומלץ, וקל להימנע ממנו.
סגנון: איך כותבים קוד R
מעבר לדקדוק, ל-R יש מוסכמות קהילתיות חזקות (שמעוגנות במדריך הסגנון של tidyverse, שרוב האקוסיסטם עוקב אחריו):
<-להשמה,=רק לארגומנטים בתוך קריאות.- שמות ב-
snake_case:monthly_revenue, לאmonthlyRevenueולאmonthly.revenue. נקודות חוקיות בשמות ב-R, אבל עדיף להימנע מהן: הן מתנגשות בדפוס שמות שהמנגנונים הפנימיים של R משתמשים בו. - רווחים סביב אופרטורים (
x <- a * 2, לאx<-a*2) ואחרי פסיקים. - הזחה של ארבעה רווחים בתוך סוגריים מסולסלים (יש צוותים שמשתמשים בשניים; בחרו אחד והקפידו עליו).
- פקודה אחת בכל שורה.
המפרש לא אוכף אף אחד מאלה. כל מי שקורא את הקוד שלכם אוכף את כולם. חלק מתן השמות של הסיפור הזה ממשיך ב-משתנים.
מה לקחת מכאן
- R מחשבת ביטויים ומדפיסה אוטומטית ביטויים חשופים בקונסולה, אבל לא בתוך פונקציות או לולאות.
- בצעו השמה עם
<-("מקבל"); השתמשו ב-=רק כדי לתת שמות לארגומנטים בקריאות לפונקציות. - R רגישה לחלוטין לאותיות גדולות וקטנות: טעויות באותיות גדולות גורמות לרוב שגיאות ה-"not found" בהתחלה.
- הכול וקטור, ופעולות חלות איבר אחר איבר:
c(1, 2, 3) * 2הוא2 4 6, בלי לולאה. - סוגריים מסולסלים מגדירים בלוקים, ירידת שורה מסיימת פקודות, ו-
snake_caseיחד עם מוסכמות הרווחים גורמים לקוד שלכם להיקרא כמו של כולם.
הבא בתור: הערות. איך מוסיפים הערות לקוד R, ומה עושים עם זה שאין ב-R תחביר של הערת בלוק.
שאלות נפוצות
מה המשמעות של <- ב-R?
<- הוא אופרטור ההשמה של R: x <- 5 שומר את הערך 5 תחת השם x. קראו אותו כ'מקבל'. גם = מבצע השמה ברמה העליונה, אבל המוסכמה בקהילה, שכל מדריכי הסגנון הגדולים אוכפים, היא <- להשמה ו-= רק למתן שמות לארגומנטים בתוך קריאות לפונקציות.
האם R רגישה לאותיות גדולות וקטנות?
כן, לגמרי. total, Total ו-TOTAL הם שלושה שמות שונים, וקריאה ל-Mean(x) במקום mean(x) היא שגיאה, לא אזהרה. שגיאה מסוג 'could not find function' או 'object not found' היא פעמים רבות סתם טעות הקלדה באותיות גדולות.
האם צריך נקודה-פסיק ב-R?
לא. ירידת שורה מסיימת פקודה. נקודה-פסיק נחוצה רק כדי לדחוס שתי פקודות לשורה אחת (a <- 1; b <- 2), ומדריכי סגנון ממליצים להימנע מזה בכל מקרה. כתבו פקודה אחת בכל שורה ותשכחו מנקודה-פסיק.
מה המשמעות של כך ש-R היא וקטורית?
הפעולות הבסיסיות של R עובדות על וקטורים שלמים בבת אחת. c(1, 2, 3) * 2 נותן 2 4 6: הכפל חל על כל איבר בלי לולאה. רוב הקוד שבשפה אחרת היה לולאת for הוא ב-R ביטוי יחיד.