Menu

אופרטורים ב-R: חשבון, השוואה, לוגיקה, %in% ו-%%

כל אופרטור שצריך ב-R: חשבון כולל %% ו-%/%, השוואות וקטוריות, ההבחנה בין & ל-&&, ו-%in% לבדיקת שייכות.

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

האופרטורים ש-R נותן לכם

האופרטורים של R מתחלקים לארבע קבוצות עבודה: חשבון (+ - * / ^ %% %/%), השוואה (== != < <= > >=), לוגיקה (& | && || ! xor), ובדיקת השייכות %in%. שני דברים מבדילים אותם מרוב השפות: כמעט כולם וקטוריים, כלומר פועלים על וקטורים שלמים בבת אחת, איבר אחר איבר, ול-R יש שני אופרטורי AND ושני אופרטורי OR שאינם ניתנים להחלפה. העמוד הזה מכסה את כולם, ובנוסף את מלכודות הקדימות שמייצרות תשובות שגויות בשקט.

חשבון: +, -, *, /, ^, %% ו-%/%

חמשת הראשונים עושים את מה שמצפים. השניים העטופים בסימני אחוז, %% (מודולו, השארית) ו-%/% (חילוק שלמים, המנה), הם אלה שאנשים מחפשים:

שימו לב ש-/ תמיד מבצע חילוק בנקודה צפה: 17 / 5 הוא 3.4, אף פעם לא 3. אם אתם רוצים את החלק השלם, בדיוק בשביל זה קיים %/%.

העבודה היומיומית של %% היא התחלקות. מספר הוא זוגי כשחילוק ב-2 לא משאיר שארית:

כדאי לעצור על השורה השנייה: עם אופרנד שלילי, %% של R מחזיר תוצאה עם הסימן של המחלק (-7 %% 3 הוא 2, כי -7 = -3 * 3 + 2). יש שפות שעושות את זה הפוך; אם אתם מעבירים קוד משפה אחרת, בדקו.

אופרטורי השוואה הם וקטוריים

==, !=, <, <=, >, >= משווים איבר אחר איבר ומחזירים וקטור לוגי, לא תשובה אחת:

זה המנוע שמאחורי כמעט כל סינון ב-R: משווים וקטור שלם לערך, מקבלים מסכה לוגית ומשתמשים במסכה כדי לחתוך. זהירות אחת עם == על מספרים עשרוניים: מספרים בנקודה צפה מאוחסנים בקירוב, ולכן 0.1 + 0.2 == 0.3 הוא FALSE. להשוואות עשרוניות, העדיפו all.equal() או בדקו abs(x - y) < 1e-9.

אופרטורים לוגיים: & מול && (הבלבול הקלאסי)

ל-R יש שני אופרטורי AND ושני אופרטורי OR, ובחירה באופרטור הלא נכון היא טקס חניכה.

& ו-| הם וקטוריים. הם משלבים שני וקטורים לוגיים איבר אחר איבר:

השתמשו בהם בכל פעם שאתם בונים סינון על נתונים: df[df$age > 30 & df$city == "Lisbon", ].

&& ו-|| סקלריים ומבצעים קצר חשמלי. הם מקבלים ערכים בודדים, מחזירים TRUE/FALSE יחיד, ומדלגים לגמרי על האופרנד השני אם הראשון כבר מכריע את התשובה:

השורה השנייה מדגימה קצר חשמלי: מכיוון ש-x < 0 הוא FALSE, R לעולם לא מעריך את הקריאה ל-stop(). בדיוק בגלל זה && שייך לתנאי if(): אפשר לכתוב if (!is.na(x) && x > 10) והחלק x > 10 מדולג בבטחה כש-x הוא NA.

כלל האצבע: &/| לווקטורים ולסינון נתונים, &&/|| לתנאי if(). ומאז R 4.3, זה נאכף בתוקף: העברת וקטור באורך גדול מ-1 ל-&& או ל-|| היא שגיאה (גרסאות ישנות של R השתמשו בשקט רק באיבר הראשון, מה שהסתיר באגים אמיתיים במשך שנים).

xor(a, b) משלים את הסט: TRUE כשבדיוק אחד מהשניים הוא TRUE:

%in%: בדיקת שייכות

x %in% table שואל, עבור כל איבר של x, "האם הוא מופיע במקום כלשהו ב-table?". זה אחד האופרטורים הנפוצים ביותר בקוד R אמיתי:

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

הוא גם מנצח את החלופה שהייתם כותבים אחרת, שרשרת של == שמודבקת עם |:

עם חמישה ערכים מותרים, שרשרת ה-== הופכת לקיר של חזרות; בגרסת ה-%in% פשוט מגדילים את הווקטור. יש יתרון שני, עדין יותר: %in% לעולם לא מחזיר NA:

NA == 1 הוא NA כי R לא יכול לדעת אם ערך לא ידוע שווה ל-1, התנהגות שמוסברת לעומק בערכים חסרים. ה-NA הזה מרעיל אחר כך כל if() שהוא מגיע אליו. %in% עוקף את כל הבעיה כי הוא תמיד עונה TRUE או FALSE, ולכן הוא הבחירה הבטוחה יותר לתנאים על נתונים שעלולים להיות חסרים.

מלכודות קדימות

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

שנית, הנקודתיים נקשרות חזק יותר מחשבון בינארי:

כשיש ספק, הוסיפו סוגריים. הם לא עולים כלום, וכל קורא (כולל אתם בעתיד) מפרש אותם בדיוק כמו המפרש.

$ ו-[ ]: אופרטורי הגישה

תראו גם כל הזמן את $, [ ] ו-[[ ]], שמבחינה טכנית הם גם אופרטורים, ומשמשים לשליפת ערכים ממבנים ולא לחישוב איתם:

הם מקבלים כיסוי מלא בעמודים על וקטורים, רשימות ו-data frames. כאן מספיק לזהות אותם כחברים באותה משפחת אופרטורים.

מה לקחת מכאן

  • %% נותן את השארית, %/% את המנה השלמה; x %% 2 == 0 בודק זוגיות.
  • השוואות הן וקטוריות: הן מחזירות וקטור לוגי שאפשר לסנן איתו.
  • &/| משלבים וקטורים איבר אחר איבר; &&/|| מיועדים לערכים בודדים ב-if() ומבצעים קצר חשמלי. מאז R 4.3, && על וקטור ארוך יותר הוא שגיאה.
  • x %in% table מחליף == משורשרים ולעולם לא מחזיר NA.
  • -2^2 הוא -4 ו-1:n - 1 מתחיל ב-0: הוסיפו סוגריים כשיש ספק.

בהמשך: הפעלת האופרטורים האלה בתוך if, else ו-ifelse(), משפטי התנאי של R.

שאלות נפוצות

מה עושה %% ב-R?

%% הוא אופרטור המודולו: הוא מחזיר את השארית של חילוק. 17 %% 5 הוא 2. בן הזוג שלו %/% מבצע חילוק שלמים ומחזיר את המנה בלי השארית: 17 %/% 5 הוא 3. השימוש הקלאסי ב-%% הוא בדיקה של מספרים זוגיים: x %% 2 == 0.

מה ההבדל בין & ל-&& ב-R?

& הוא וקטורי: הוא משווה שני וקטורים איבר אחר איבר ומחזיר וקטור באותו אורך. && עובד על ערכים בודדים בלבד, מבצע קצר חשמלי (מדלג על האופרנד השני אם הראשון כבר מכריע את התוצאה), ומחזיר TRUE או FALSE אחד בדיוק. השתמשו ב-& כשמסננים וקטורים, וב-&& בתוך תנאי if(). מאז R 4.3, העברת וקטור באורך גדול מ-1 ל-&& או ל-|| היא שגיאה, לא אזהרה.

מה עושה %in% ב-R?

x %in% table בודק אם כל איבר של x מופיע במקום כלשהו ב-table, ומחזיר TRUE או FALSE לכל איבר. "mango" %in% basket מחליף שרשרת של השוואות == שמחוברות עם |, ובשונה מ-== הוא לעולם לא מחזיר NA: ערך חסר בצד שנבדק פשוט מניב FALSE.

למה -2^2 מחזיר -4 ב-R?

כי ^ נקשר חזק יותר ממינוס אונרי, R קורא את -2^2 כ--(2^2), שהוא -4. אם אתם מתכוונים לריבוע של מינוס שתיים, כתבו (-2)^2, שהוא 4. לנקודתיים יש מלכודת דומה: 1:n - 1 פירושו (1:n) - 1, לא 1:(n - 1).

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

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

להתחיל