R Academy · Урок

Публикация в CRAN и сопровождение пакета

Запускайте R CMD check, устраняйте проблемы NOTE/WARNING и отправляйте пакет в CRAN

Урок 4 из 413 шагов

«Публикация в 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 -20

devtools::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-hub
  • devtools::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 releases

GitHub 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.gz
  • devtools::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 — локальная установка не требуется.

Все уроки этого курса

  1. Структура пакета с usethis и devtools
  2. Документирование функций с roxygen2
  3. Модульное тестирование с testthat
  4. Публикация в CRAN и сопровождение пакета
← Назад к R Academy