Что такое пакет
Пакет — это набор функций, документации и иногда данных, расширяющий 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).