Menu

חבילות R: install.packages(), library() ו-CRAN

איך חבילות R עובדות: התקנה מ-CRAN עם install.packages(), טעינה עם library(), require() מול library(), pkg::fun(), והחבילות ששווה להכיר.

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

מה זו חבילה

חבילה היא צרור של פונקציות, תיעוד ולפעמים נתונים שמרחיב את R. R הבסיסי נותן לכם וקטורים, מודלים וגרפים; חבילות נותנות לכם את כל השאר, וה"כל השאר" עצום. CRAN (Comprehensive R Archive Network) מארח בערך 20,000 חבילות, וכל אחת מהן נבדקת מול מבחני ההגשה של CRAN לפני שהיא מתפרסמת. המאגר הזה הוא הסיבה העיקרית ש-R נשאר תחרותי בעבודה עם נתונים: יהיה הניתוח אשר יהיה, כנראה שמישהו כבר ארז אותו.

CRAN אינו המקור היחיד: Bioconductor מארח את האקוסיסטם של הביואינפורמטיקה, והרבה חבילות בפיתוח חיות ב-GitHub (אפשר להתקין אותן עם remotes::install_github()). אבל כמתחילים אפשר להתייחס ל-CRAN כברירת המחדל ולאחרים כדברים שתפגשו כש-README יגיד לכם.

קומץ חבילות מגיע עם R עצמו (stats, utils, graphics וחבריהן) ונטען אוטומטית, ולכן mean() ו-plot() פשוט עובדות. כל השאר עובר את הטקס הדו-שלבי שלמטה.

install.packages() פעם אחת, library() בכל סשן

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

install.packages("dplyr")   # ONCE per machine: downloads from CRAN and installs
library(dplyr)              # EVERY session: loads it so your code can use it
  • install.packages("dplyr") זה כמו לקנות ספר: עושים את זה פעם אחת, והוא יושב על המדף (הדיסק) מאז והלאה. שימו לב למרכאות: אתם מעבירים את השם כמחרוזת.
  • library(dplyr) זה כמו להוריד את הספר מהמדף: עושים את זה בתחילת כל סשן של R (בפועל, בראש כל סקריפט). כאן לא צריך מרכאות: library() מיוחדת ומקבלת את השם החשוף (גם library("dplyr") עובד, אם אתם מעדיפים עקביות).

שני אופני הכישלון אומרים לכם על איזה שלב דילגתם. Error: there is no package called 'dplyr' מ-library() פירושו שהחבילה מעולם לא הותקנה. Error: could not find function "filter" (או "%>%") באמצע סקריפט פירושו שהחבילה מותקנת אבל הסשן הזה מעולם לא טען אותה. הצבת כל קריאות ה-library() ממש בראש הסקריפט, ולא מפוזרות לאורכו, הופכת את הכישלון השני לגלוי כבר בשנייה הראשונה, ומשמשת גם כרשימת התלויות של הסקריפט. התקנת tidyverse עובדת באותה דרך: install.packages("tidyverse") פעם אחת, library(tidyverse) בכל סשן, מה שטוען את dplyr, את ggplot2 ואת שאר סט הליבה בשורה אחת.

מה שלא כדאי לעשות הוא להשאיר install.packages() בתוך סקריפט שמריצים שוב ושוב או משתפים: הוא מוריד מחדש בכל ריצה ועלול להפתיע את מי שמריץ אותו. התקנה היא פעולה של קונסולה; טעינה היא פעולה של סקריפט.

require() ו-pkg::fun()

require() נראית כמו מילה נרדפת ל-library(), ושימוש שגוי בה ככזו נפוץ. ההבדל הוא מה שקורה כשהחבילה חסרה: library() עוצרת עם שגיאה; require() מדפיסה אזהרה, מחזירה FALSE ומאפשרת לסקריפט להמשיך, בדרך כלל כדי למות עשרים שורות אחר כך עם "could not find function" מבלבל במקום ההודעה הכנה "no package called". לטעינת תלויות, השתמשו ב-library(): כישלון בקול רם בראש הסקריפט הוא תכונה. require() מצדיקה את עצמה רק בבדיקות מותנות, שבהן ערך ההחזרה שלה הוא העיקר:

if (!require(praise)) {
    install.packages("praise")
    library(praise)
}

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

(stats נטענת אוטומטית בכל מקרה, כך ש-sd() רגיל עובד גם כן, אבל התחביר זהה לכל חבילה מותקנת.) :: זורח בשני מקומות: קריאות חד פעמיות שבהן שורת library() מלאה מוגזמת, והבחנה כששתי חבילות טעונות מייצאות אותו שם: dplyr::filter() מול stats::filter() היא ההתנגשות הקלאסית.

שמירה על חבילות מעודכנות

חבילות מתפתחות בנפרד מ-R, ולכן העדכון באחריותכם:

update.packages()          # offers to update everything outdated
update.packages(ask = FALSE)   # same, without prompting per package

כלל אחד לא מובן מאליו: חבילות נבנות מול גרסת major.minor מסוימת של R. כשמשדרגים את R עצמו (נניח מ-4.3 ל-4.4, ראו התקנת R), ספריית החבילות הישנה בדרך כלל לא עוברת איתכם, והתיקון הוא פשוט להתקין מחדש את החבילות שאתם משתמשים בהן תחת הגרסה החדשה. עשר דקות של install.packages(), לא אסון, אבל זה מפתיע אנשים בפעם הראשונה שהסקריפטים שלהם מקבלים התקנה טרייה של R עם קיר של שגיאות "no package called".

לראות מה יש לכם

שלוש פונקציות עונות על "מה מותקן ואיפה":

installed.packages()[, "Version"]   # every installed package with its version
sessionInfo()                       # R version + what THIS session has loaded
.libPaths()                         # the folders where packages are installed

installed.packages() מחזירה מטריצה עם שורה לכל חבילה; עמודת ה-Version היא בדרך כלל מה שרוצים. sessionInfo() הוא הכלי לשחזוריות: הדביקו את הפלט שלו בדיווח על באג והקורא יידע את גרסת ה-R שלכם, את מערכת ההפעלה ואת הגרסאות המדויקות של כל חבילה טעונה. .libPaths() מראה את תיקיות הספרייה ש-R מחפש בהן; הידיעה שהיא קיימת מפענחת את "לאן החבילה הזו בעצם הלכה?" ולמה הרשאות מנהל חשובות לפעמים במחשבים משותפים.

חבילות ששווה להכיר

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

  • dplyr: פעלי עיבוד הנתונים: filter, mutate, group_by, summarize.
  • ggplot2: חבילת הגרפים הסטנדרטית; רוב הגרפיקה של R שרואים ברשת היא ggplot2.
  • tidyr: שינוי צורה של נתונים בין פורמט רחב לארוך (pivot_longer, pivot_wider).
  • readr / readxl: קריאה מהירה של CSV וקריאת קובצי Excel, בהתאמה.
  • lubridate: תאריכים שמתנהגים כמו שמצפים.
  • stringr: עיבוד מחרוזות עקבי.
  • data.table: אקוסיסטם חלופי ובעל ביצועים גבוהים ל-data frames; דיאלקט שונה מה-tidyverse, אהוב במיוחד לנתונים גדולים.
  • shiny: אפליקציות ווב אינטראקטיביות שנכתבות כולן ב-R.

שש הראשונות הן הליבה של ה-tidyverse ומגיעות יחד עם install.packages("tidyverse"). אין שום חובה להשתמש באף אחת מהן, R הבסיסי יכול לעשות את כל זה, אבל האקוסיסטם הוא המקום שבו חי רוב קוד ה-R המודרני.

מה לקחת מכאן

  • CRAN מארח כ-20,000 חבילות שנבדקו; Bioconductor ו-GitHub מכסים את השאר.
  • install.packages("name") פעם אחת לכל מחשב (חובה מרכאות); library(name) פעם אחת לכל סשן, בראש הסקריפט.
  • library() נכשלת בקול, וזה טוב; require() מחזירה FALSE, שימושית רק בתוך בדיקות.
  • pkg::fun() משתמש בפונקציה אחת בלי לצרף את החבילה, ופותר התנגשויות שמות.
  • update.packages() שומר על עדכניות; שדרוג גדול של R פירושו התקנה מחדש של חבילות.
  • sessionInfo() הוא הדרך לספר למישהו (או לעצמכם בעתיד) בדיוק על מה הקוד שלכם רץ.

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

שאלות נפוצות

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

הריצו install.packages("name") עם שם החבילה במרכאות, למשל install.packages("dplyr"). R מוריד אותה מ-CRAN ומתקין אותה על המחשב שלכם. עושים את זה רק פעם אחת לכל מחשב; אחר כך טוענים אותה בכל סשן עם library(dplyr).

מה ההבדל בין install.packages() ל-library()?

install.packages("dplyr") מוריד את החבילה למחשב, פעם אחת לכל מחשב. library(dplyr) טוען חבילה שכבר מותקנת לסשן הנוכחי, פעם אחת לכל סשן, בדרך כלל בראש כל סקריפט. התקנה בלי טעינה לא נותנת שום דבר שמיש; טעינה בלי התקנה נכשלת עם "there is no package called 'dplyr'".

מה ההבדל בין library() ל-require() ב-R?

שתיהן טוענות חבילה, אבל בכישלון library() עוצרת עם שגיאה בעוד ש-require() רק מזהירה ומחזירה FALSE. זה הופך את library() לנכונה לסקריפטים, להיכשל בקול ומוקדם, ואת require() לשימושית רק בתוך בדיקות מותנות כמו if (!require(pkg)) install.packages(pkg).

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

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

להתחיל