CRAN への提出とパッケージメンテナンス
R CMD check を実行し、NOTE や WARNING の問題を解消して、CRAN に提出します。
「CRAN への提出とパッケージメンテナンス」はCoddyKit上の無料R Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。
CRANへの提出プロセス
CRAN(Comprehensive R Archive Network)は、公式のRパッケージリポジトリです。パッケージを提出するには、厳格なポリシーに基づく自動チェックと人によるレビューに合格する必要があります。手順は、準備 → チェック → ビルド → 提出 → フィードバックに基づく修正です。
devtools::check() — エラーと警告をゼロにする
提出前に、devtools::check()でERRORを0件、WARNINGを0件にする必要があります。NOTEは許容されますが、できるだけ減らしてください。checkで検出される一般的な問題:
- 関数または引数がドキュメント化されていない
- 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()は、CRANへの提出に適した.tar.gz形式のソースバンドル(例:mypackage_0.1.0.tar.gz)を作成します。ローカルOS向けに配布するバイナリパッケージを作成するには、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ポリシーへの同意を確認したうえで、CRANのWeb APIを使って.tar.gzをhttps://cran.r-project.org/submit.htmlに提出します。
# 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は、複数のOSとRのバージョンでパッケージをチェックします。提出前に幅広くテストしてください:
devtools::check_win_devel()— win-builder(Windows、R-devel)に提出しますdevtools::check_rhub()— R-hubを介して複数のLinux/Windowsプラットフォームでチェックします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-lib/actionsを使用して、プッシュするたびにR CMD checkを自動実行します。usethis::use_github_action('check-standard')は、複数のRバージョンを対象にUbuntu、macOS、Windowsでチェックするワークフローを作成します。
# 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 checksCRANレビュアーからのフィードバックへの対応
CRANレビュアーから修正を求められることがあります。よくある依頼は次のとおりです:
- 時間のかかる例を
\donttest{}で囲む - UIを開く関数に
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()を使用する - ドキュメント用Webサイトのために
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()— ERROR 0件、WARNING 0件が必須です- CRANポリシー:例でインターネットを使用しない、例は5秒未満、書き込みには
tempdir()を使用する devtools::build()—.tar.gzバンドルを作成しますdevtools::release()— 対話形式で提出を案内します- クロスプラットフォームチェック:
check_win_devel()、R-hub - バージョン見出しを含む
NEWS.md;use_version('minor')でバージョンを更新します - プッシュ時のCIには
r-lib/actionsを使用したGitHub Actionsを使います - レビュアーからのフィードバックには14日以内に対応します
AI チューターと学ぶ R — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 43
- レッスン
- 159
よくある質問
「CRAN への提出とパッケージメンテナンス」レッスンは無料ですか?
はい。「CRAN への提出とパッケージメンテナンス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。
「CRAN への提出とパッケージメンテナンス」で何を学びますか?
R CMD check を実行し、NOTE や WARNING の問題を解消して、CRAN に提出します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
R Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「CRAN への提出とパッケージメンテナンス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このR Academyレッスンでコードを書いて実行できますか?
はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- usethis と devtools によるパッケージ構成
- roxygen2 による関数ドキュメントの作成
- testthat による単体テスト
- CRAN への提出とパッケージメンテナンス