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() в каждой сессии

Это путаница новичков номер один, так что изложим как можно чётче. Заставить пакет работать — это два разных действия с двумя разными сроками жизни:

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

Одно неочевидное правило: пакеты собираются под конкретную версию R вида major.minor. Когда вы обновляете сам 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 — альтернативная высокопроизводительная экосистема датафреймов; иной диалект по сравнению с 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 programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ