Публикация в CRAN и сопровождение пакета
Запускайте R CMD check, устраняйте проблемы NOTE/WARNING и отправляйте пакет в CRAN
«Публикация в CRAN и сопровождение пакета» — бесплатный урок R Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.
Процесс отправки пакета в CRAN
CRAN (Comprehensive R Archive Network) — официальный репозиторий пакетов R. Для отправки пакета необходимо пройти автоматические проверки и проверку специалистами на соответствие строгим правилам. Процесс выглядит так: подготовка → проверка → сборка → отправка → исправления по отзывам.
devtools::check() — ноль ошибок и предупреждений
Перед отправкой devtools::check() должен выдавать 0 ОШИБОК и 0 ПРЕДУПРЕЖДЕНИЙ. ЗАМЕЧАНИЯ допустимы, но их следует свести к минимуму. Распространённые проблемы, которые обнаруживает проверка:
- Функции или аргументы без документации
- Отсутствующие импорты пакетов в DESCRIPTION
- Примеры, завершающиеся ошибкой или выполняющиеся слишком долго
- Использование глобальных переменных (используйте
utils::globalVariables())
# devtools::check() # or Ctrl+Shift+E
#
# Target output:
# -- R CMD check results -------------------------
# Duration: 45.3s
# 0 errors v | 0 warnings v | 1 note x
# NOTE: New submission.
#
# 'New submission' is an expected NOTE for first-time packages.
# All actual ERRORs and WARNINGs must be fixed before submitting.Правила CRAN — основные требования
CRAN предъявляет строгие требования. Чаще всего нарушают следующие правила:
- Нельзя обращаться к интернету в примерах, тестах и виньетках, если это не зависит от доступности соединения
- Общее время выполнения примеров — < 5 секунд — для медленных примеров используйте
\dontrun{}или\donttest{} - Нельзя записывать данные в домашний каталог пользователя — в примерах используйте
tempdir() - Нельзя задавать пути жёстко — для всех операций с файлами используйте относительные пути или
tempdir()
# Correct: examples that write to tempdir
# #' @examples
# #' tmp <- tempfile()
# #' write.csv(mtcars, tmp)
# #' read.csv(tmp)
# #' unlink(tmp)
#
# Correct: skip slow or network examples
# #' @examples
# #' \dontrun{
# #' # slow operation
# #' fit_big_model(huge_dataset)
# #' }devtools::build() — создание архива пакета
devtools::build() создаёт исходный архив .tar.gz (например, mypackage_0.1.0.tar.gz), подходящий для отправки в CRAN. Используйте devtools::build(binary = TRUE), чтобы создать двоичный пакет для распространения в вашей локальной ОС.
# devtools::build()
# => mypackage_0.1.0.tar.gz
#
# What build does:
# 1. Runs devtools::document() to regenerate man/ and NAMESPACE
# 2. Compiles vignettes (if any)
# 3. Bundles R/, man/, DESCRIPTION, NAMESPACE, tests/ etc.
# 4. Excludes files listed in .Rbuildignore
#
# Inspect the bundle:
# tar -tzf mypackage_0.1.0.tar.gz | head -20devtools::release() — интерактивная отправка
devtools::release() запускает интерактивный список проверок и проводит Вас через финальные проверки перед отправкой, просит подтвердить соблюдение правил CRAN, а затем отправляет .tar.gz на https://cran.r-project.org/submit.html с помощью веб-API CRAN.
# devtools::release()
#
# Interactive questions include:
# - Have you checked on R-devel?
# - Have you checked on Windows with win-builder?
# - Is there a single top-level .R file in tests/?
# - Have you removed donttest{} for essential examples?
# - Is the package correctly versioned?
#
# After answering, it submits and emails the CRAN team.Проверка на нескольких платформах
CRAN проверяет пакеты на разных ОС и версиях R. Перед отправкой проведите широкую проверку:
devtools::check_win_devel()— отправляет пакет в win-builder (Windows, R-devel)devtools::check_rhub()— проверяет пакет на нескольких платформах Linux и Windows через R-hubdevtools::check_mac_release()— проверяет пакет в macOS
# Check on Windows R-devel (submits to win-builder, results emailed):
# devtools::check_win_devel()
#
# Check on multiple platforms via R-hub:
# rhub::check_for_cran() # requires rhub package and account
#
# Minimum: check locally + win-builder before every CRAN submission
cat('CRAN checks on Windows, macOS, and multiple Linux distros
')NEWS.md — информирование об изменениях
NEWS.md описывает изменения между версиями. CRAN требует этот файл для обновлений. Оформляйте каждую версию как заголовок со списком пунктов, описывающих изменения. Пользователи и проверяющие CRAN читают этот файл, чтобы понять, что изменилось.
# NEWS.md format:
#
# # mypackage 0.2.0
# * Added subtract() function for element-wise subtraction.
# * add() now accepts complex numbers.
# * Fixed bug where add(NA, x) returned 0 instead of NA.
#
# # mypackage 0.1.0
# * Initial CRAN release.
# * Core add() function for numeric addition.
cat('usethis::use_news_md() creates NEWS.md with the right format
')usethis::use_version() для увеличения версии
usethis::use_version('minor') увеличивает номер версии в DESCRIPTION и добавляет новый заголовок-заполнитель в NEWS.md. Используйте семантическое версионирование: major.minor.patch.
# Version bump commands:
# usethis::use_version('patch') # 0.1.0 -> 0.1.1 (bug fixes)
# usethis::use_version('minor') # 0.1.0 -> 0.2.0 (new features)
# usethis::use_version('major') # 0.1.0 -> 1.0.0 (breaking changes)
# usethis::use_version('dev') # 0.1.0 -> 0.1.0.9000 (dev suffix)
#
# CRAN packages should NOT have a dev suffix (e.g., 0.9000)
# Dev suffix signals work-in-progress on GitHub between releasesGitHub Actions для непрерывной интеграции
Автоматизируйте проверку R CMD при каждой отправке изменений с помощью r-lib/actions. usethis::use_github_action('check-standard') создаёт рабочий процесс, который выполняет проверку в Ubuntu, macOS и Windows для нескольких версий R.
# usethis::use_github_action('check-standard')
# Creates .github/workflows/R-CMD-check.yaml
#
# The workflow:
# - triggers on push and pull_request
# - runs on ubuntu-latest, macos-latest, windows-latest
# - tests on R release, R devel, and R oldrel
# - caches installed packages for faster runs
# - reports check results as GitHub status checksРабота с отзывами проверяющих CRAN
Проверяющие CRAN могут запросить изменения. Распространённые запросы:
- Заключить долгие примеры в
\donttest{} - Использовать проверки
if (interactive())для функций, открывающих пользовательские интерфейсы - Исправить орфографию в документации (используйте
usethis::use_spell_check()) - Добавить более подробные сообщения об ошибках
Оперативно отвечайте и отправляйте пакет повторно. Несколько раундов проверки — это нормально.
# Spell check DESCRIPTION and man/ pages:
# usethis::use_spell_check()
# spelling::spell_check_package() # run the check
#
# Add words to WORDLIST to ignore false positives:
# spelling::update_wordlist()
#
# After making all changes:
# devtools::check() # confirm 0 errors/warnings
# devtools::release() # resubmitСопровождение пакета после выпуска
После принятия пакета CRAN постоянное сопровождение включает:
- Отслеживание предупреждений об устаревании зависимостей при проверках R-devel
- Устранение сбоев проверки CRAN в течение 14 дней (требование CRAN)
- Использование
lifecycle::deprecate_warn()для корректного объявления старых функций устаревшими - Настройку
usethis::use_github_action('pkgdown')для сайта с документацией
# Mark a function as deprecated:
# library(lifecycle)
#
# old_add <- function(x, y) {
# lifecycle::deprecate_warn('0.2.0', 'old_add()', 'add()')
# add(x, y)
# }
#
# Users see: 'old_add()' was deprecated in mypackage 0.2.0.
# Please use 'add()' instead.Быстрая проверка: правила CRAN для примеров
Какой тег следует использовать, чтобы включить в документацию долгий пример, но не допустить его выполнения автоматической проверкой CRAN?
Повторение: отправка и сопровождение пакета в CRAN
Процесс выпуска пакета в CRAN:
devtools::check()— требуется 0 ОШИБОК и 0 ПРЕДУПРЕЖДЕНИЙ- Правила CRAN: отсутствие интернета в примерах, примеры короче 5 секунд, использование
tempdir()для записи данных devtools::build()— создаёт архив.tar.gzdevtools::release()— интерактивная отправка с пошаговыми подсказками- Проверки на разных платформах:
check_win_devel(), R-hub NEWS.mdс заголовками версий; увеличение версии с помощьюuse_version('minor')- GitHub Actions с
r-lib/actionsдля непрерывной интеграции при отправке изменений - Ответ на отзывы проверяющих в течение 14 дней
Изучай R с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 43
- Уроки
- 159
Часто задаваемые вопросы
Урок «Публикация в CRAN и сопровождение пакета» бесплатный?
Да — полный текст урока «Публикация в CRAN и сопровождение пакета» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.
Чему я научусь в уроке «Публикация в CRAN и сопровождение пакета»?
Запускайте R CMD check, устраняйте проблемы NOTE/WARNING и отправляйте пакет в CRAN Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать R Academy?
Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Публикация в CRAN и сопровождение пакета»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке R Academy?
Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Структура пакета с usethis и devtools
- Документирование функций с roxygen2
- Модульное тестирование с testthat
- Публикация в CRAN и сопровождение пакета