cran-extrachecks について
CRAN への提出を準備する R パッケージ開発者向けのスキルです。一般的な審査要件を体系的に確認し、問題と修正案を示します。変更はユーザーの承認後に行います。
主な機能
- 01チェックリストに沿った CRAN 提出確認
- 02DESCRIPTION とドキュメントのレビュー
- 03README、リンク、ライセンスの確認
- 04問題に対する修正案の提示
- 05承認後の変更と検証
活用シーン
- 01R パッケージの初回 CRAN 提出準備
- 02再提出前の指摘事項への対応
- 03エクスポート関数のドキュメントと例の確認
- 04URL、README、パッケージメタデータの問題発見
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ posit-dev/ skills --skill cran-extrachecksインストール後、Claude Code で/cran-extrachecksを入力して読み込まれたか確認します。
詳細
CRAN の追加チェック
devtools::check() では検出されないものの、CRAN のレビュアーが適用する一般的な臨時要件を体系的に確認し、R パッケージ開発者が CRAN への提出に備えられるよう支援します。
ワークフロー
- 初回評価:今回が初回提出か再提出かをユーザーに確認します
- 標準チェックリストの実施:以下の各項目を順に確認します
- 問題の特定:ファイルを確認しながら、具体的な問題を記録します
- 修正案の提示:見つかった問題ごとに具体的な変更を提案します
- 変更の実施:ユーザーの承認を得た場合にのみ編集します
- 確認:すべての変更が完了したことを確認します
CRAN 提出準備の標準チェックリスト
以下の項目を順に確認します。
- NEWS.md を作成する:存在しない場合は
usethis::use_news_md()を実行します - cran-comments.md を作成する:存在しない場合は
usethis::use_cran_comments()を実行します - README を確認する:
- パッケージが CRAN に受理された時点で有効なインストール手順が含まれていることを確認します(通常は
install.packages("pkgname")です)。 - 相対リンクが含まれていないことを確認します。GitHub では機能しますが、CRAN では指摘されます。パッケージのドキュメントへの完全な URL を使用するか、リンクを削除してください。
- README でパッケージの目的と機能が明確に説明されていますか?
- 重要:README.Rmd が存在する場合は、README.Rmd のみを編集してください(README.md は上書きされます)。その後、
devtools::build_readme()を実行して README.md を再生成してください。
- パッケージが CRAN に受理された時点で有効なインストール手順が含まれていることを確認します(通常は
- DESCRIPTION の校正:
Title:とDescription:のフィールドを注意深く確認します(詳しいガイダンスは以下を参照してください) - 関数ドキュメントの確認:エクスポートされたすべての関数に
@returnと@examplesがあることを確認します(詳しいガイダンスは以下を参照してください) - 著作権者の確認:
Authors@R:に[cph]役割の著作権者が含まれていることを確認します - 同梱ファイルのライセンス確認:含まれているサードパーティ製ファイルのライセンスを確認します
- URL チェックの実行:
urlchecker::url_check()を使用し、問題を修正します
CRAN の詳細チェック
ドキュメントの要件
戻り値のドキュメント(厳格に適用)
CRAN では現在、エクスポートされたすべての関数に @return のドキュメントを厳格に求めています。roxygen2 タグ @return を使用して、関数が返す値を記述してください。
@keywords internalとマークされた関数にも必要です- 関数が何も返さない場合にも必要です。「
@return None」などと記述してください - エクスポートされたすべての関数に記載する必要があります
例:
# Missing @return - WILL BE REJECTED
#' Calculate sum
#' @export
my_sum <- function(x, y) {
x + y
}
# Correct - includes @return
#' Calculate sum
#' @param x First number
#' @param y Second number
#' @return A numeric value
#' @export
my_sum <- function(x, y) {
x + y
}
# For functions with no return value
#' Print message
#' @param msg Message to print
#' @return None, called for side effects
#' @export
print_msg <- function(msg) {
cat(msg, "\n")
}
エクスポートされた関数の例
エクスポートされた関数に意味のある戻り値がある場合、ほぼ間違いなく @examples セクションが必要です。roxygen2 タグ @examples を使用してください。
@keywords internalとマークされた関数にも必要です- ディレクトリの作成など、副作用のみを目的とする関数には例外があります
- 例は実行可能でなければなりません
エクスポートされていない関数の例
エクスポートされていない関数の roxygen 例を書く場合は、次のいずれかを行う必要があります。
:::記法で呼び出します:pkg:::my_fun()@noRdタグを使用して.Rdファイルの作成を抑制します
\dontrun{} の使用は控えめに
\dontrun{} は、例を本当に実行できない場合(追加ソフトウェアや API キーがない場合など)に限り使用してください。
- エラーを示す場合は、代わりに呼び出しを
try()で囲みます - カスタム述語(例:
googlesheets4::sheets_has_token())を使い、if ()ブロックで条件を指定することを検討します - 条件として
interactive()を使用できる場合もあります - 実行に時間がかかる例(5 秒超)には
\donttest{}を使用できます
例のコードをコメントアウトしない
# BAD - Will be rejected
#' @examples
#' # my_function(x) # Don't do this!
CRAN のガイダンス:「例のコード行は、決してコメントアウトしないでください。定期的に実行してチェックできる、簡単な例を見つけるのが理想的です。」
推奨パッケージを必要とする例の条件分岐
推奨パッケージが必要な例のセクション全体には @examplesIf を使用してください。
#' @examplesIf rlang::is_installed("dplyr")
#' library(dplyr)
#' my_data %>% my_function()
例の中の個々のコードブロックには、次を使用してください。
#' @examples
#' if (rlang::is_installed("dplyr")) {
#' library(dplyr)
#' my_data %>% my_function()
#' }
DESCRIPTION の Title フィールド
CRAN では Title に厳格な要件があります。
タイトルケースを使用する
「a」「the」などの冠詞を除き、すべての単語を大文字で始めます。書式を整えるには tools::toTitleCase() を使用してください。
冗長な表現を避ける
次のよくある表現は指摘の対象になります。
- 「A Toolkit for」→ 削除
- 「Tools for」→ 削除
- 「for R」→ 削除
例:
# BAD
Title: A Toolkit for the Construction of Modeling Packages for R
# GOOD
Title: Construct Modeling Packages
# BAD
Title: Command Argument Parsing for R
# GOOD
Title: Command Argument Parsing
ソフトウェア名/パッケージ名を引用符で囲む
ソフトウェア名と R パッケージ名はすべて、シングルクォートで囲みます。
# GOOD
Title: Interface to 'Tiingo' Stock Price API
文字数制限
タイトルは 65 文字未満にしてください。
DESCRIPTION の Description フィールド
禁止されている表現で始めない
CRAN では、次の表現で始まる説明は却下されます。
- 「This package」
- パッケージ名
- 「Functions for」
# BAD
Description: This package provides functions for rendering slides.
Description: Functions for rendering slides to different formats.
# GOOD
Description: Render slides to different formats including HTML and PDF.
3~4 文に拡張する
1 文のみの説明では不十分です。次の内容をより広く説明してください。
- パッケージの機能
- パッケージが役立つ理由
- 解決に役立つ問題の種類
# BAD (too short)
Description: Render slides to different formats.
# GOOD
Description: Render slides to different formats including HTML and PDF.
Supports custom themes and progressive disclosure patterns. Integrates
with 'reveal.js' for interactive presentations. Designed for technical
presentations and teaching materials.
関数名ではなく、ソフトウェア名を引用符で囲む
# BAD
Description: Uses 'case_when()' to process data.
# GOOD
Description: Uses case_when() to process data with 'dplyr'.
ソフトウェア名、パッケージ名、API 名はシングルクォートで囲みます(「R」を含む)。関数名は囲みません。
すべての頭字語を展開する
すべての頭字語は、初出時に正式名称に展開する必要があります。
# BAD
Description: Implements X-SAMPA processing.
# GOOD
Description: Implements Extended Speech Assessment Methods Phonetic
Alphabet (X-SAMPA) processing.
出版物のタイトルに限り、ダブルクォートを使用する
ダブルクォートは出版物のタイトルにのみ使用し、フレーズや強調には使用しないでください。
# BAD
Description: Handles dates like "the first Monday of December".
# GOOD
Description: Handles dates like the first Monday of December.
URL とリンクの検証
すべての URL で HTTPS を使用する
CRAN では、すべての URL に https:// プロトコルを使用する必要があります。HTTP リンクは却下されます。
# BAD
URL: http://paleobiodb.org/
# GOOD
URL: https://paleobiodb.org/
リダイレクトする URL を使用しない
CRAN では、別の場所にリダイレクトする URL は却下されます。却下例:
Found the following (possibly) invalid URLs:
URL: https://h3geo.org/docs/core-library/coordsystems#faceijk-coordinates
(moved to https://h3geo.org/docs/core-library/coordsystems/)
urlchecker パッケージを使用する
# Find redirecting URLs
urlchecker::url_check()
# Automatically update to final destinations
urlchecker::url_update()
公開後に有効になる URL はそのままにする
現在は解決できなくても、パッケージが CRAN に公開された後に有効になる URL があります。これらは変更しないでください。
- CRAN バッジの URL(例:
https://cran.r-project.org/package=pkgname) - CRAN ステータスバッジ(例:
https://www.r-pkg.org/badges/version/pkgname) - CRAN チェック結果(例:
https://cranchecks.info/badges/pkgname) - リリース後にデプロイされる r-universe または pkgdown サイト上のパッケージドキュメントの URL
urlchecker::url_check() がこれらの URL を指摘した場合は、そのままにしてください。これらは、パッケージが CRAN に公開されると有効になる予定の URL です。
無効なファイル URI を確認する
README 内の相対リンクは、パッケージのビルド後にも存在している必要があります。よくある問題:
Found the following (possibly) invalid file URI:
URI: CODE_OF_CONDUCT.md
From: README.md
これは、ファイルが .Rbuildignore に含まれている場合に発生します。解決方法:
.Rbuildignoreからファイルを削除する- 相対リンクのないセクションを生成する
usethis::use_code_of_conduct()を使用する
管理上の要件
著作権者のロール
著者が自分 1 人だけの場合でも、Authors フィールドに常に [cph] ロールを追加してください。
# Required
Authors@R: person("John", "Doe", role = c("aut", "cre", "cph"))
Posit がサポートするパッケージ
Posit 関連の GitHub 組織(posit-dev、rstudio、r-lib、tidyverse、tidymodels)に属するパッケージ、または @posit.co のメールアドレスを持つ人がメンテナンスするパッケージでは、著作権者および資金提供者として Posit Software, PBC を記載してください。
Authors@R: c(
person("Jane", "Doe", role = c("aut", "cre"),
email = "[email protected]"),
person("Posit Software, PBC", role = c("cph", "fnd"),
comment = c(ROR = "03wc8by49"))
)
LICENSE の年
LICENSE の年を現在の提出年に更新してください。
# If LICENSE shows 2024 but submitting in 2026
# Update: 2024 → 2026
手法に関する参考文献
CRAN から次のように求められる場合があります。
パッケージの手法を説明する参考文献がある場合は、Description フィールドに追加してください……
参考文献がない場合は、その旨を説明するメールを返信してください。cran-comments.md にあらかじめ注記を追加することも検討してください。
## Method References
There are no published references describing the methods in this package.
The package implements original functionality for [brief description].
確認する主要ファイル
次のファイルを順に確認してください。
- DESCRIPTION:Title、Description、Authors@R、URL、ライセンスの年
- R/*.R:関数ドキュメント(
@return、@examples、@examplesIf、@noRd) - README.Rmd(存在する場合):このファイルを編集し(README.md ではありません)、その後
devtools::build_readme()を実行する - README.md:インストール手順、相対リンク、URL を確認する。README.Rmd が存在しない場合に限り、直接編集する
- cran-comments.md:レビュアー向けの事前注記
- NEWS.md:今回のリリースに関するバージョン情報
- .Rbuildignore:README で参照されているファイル
よくある修正パターン
DESCRIPTION の Title:
# Before
Title: A Toolkit for the Construction of Modeling Packages for R
# After
Title: Construct Modeling Packages
DESCRIPTION の Description:
# Before
Description: This package provides functions for rendering slides.
# After
Description: Render slides to different formats including HTML and PDF.
Supports custom themes and progressive disclosure. Integrates with
'reveal.js' for interactive presentations.
関数ドキュメント:
# Before - Missing @return
#' Calculate total
#' @param x Values
#' @export
calc_total <- function(x) sum(x)
# After - Complete documentation
#' Calculate total
#' @param x Numeric values to sum
#' @return A numeric value representing the sum
#' @examples
#' calc_total(1:10)
#' @export
calc_total <- function(x) sum(x)
便利なツール
tools::toTitleCase()- タイトルの大文字・小文字を適切に整えますurlchecker::url_check()- 問題のある URL を検索しますurlchecker::url_update()- リダイレクトされる URL を修正しますusethis::use_news_md()- NEWS.md を作成しますusethis::use_cran_comments()- cran-comments.md を作成しますdevtools::build_readme()- README.Rmd から README.md を再生成しますusethis::use_code_of_conduct()- 相対リンクを使わずに CoC を追加しますusethis::use_build_ignore()- R パッケージのビルド時にファイルを無視しますusethis::use_package()- DESCRIPTION にパッケージの依存関係を追加しますusethis::use_tidy_description()- DESCRIPTION の書式を整えます
最終確認チェックリスト
提出前に漏れがないことを確認するため、次のチェックリストを使用してください。
ファイルと構成
-
NEWS.mdがあり、このバージョンでの変更が記載されている -
cran-comments.mdがあり、提出に関する注記が記載されている - README.Rmd がある場合は、README.md ではなく README.Rmd を編集し、
devtools::build_readme()を実行した - README に有効なインストール手順(
install.packages("pkgname"))が記載されている - README に相対リンクがない(すべてのリンクが完全な URL であるか、削除されている)
DESCRIPTION ファイル
-
Title:がタイトルケースになっている -
Title:に冗長な表現(「A Toolkit for」「Tools for」「for R」)が含まれていない -
Title:内のソフトウェア名/パッケージ名がすべて一重引用符で囲まれている -
Title:が 65 文字未満である -
Description:が「This package」、パッケージ名、または「Functions for」で始まっていない -
Description:が目的と有用性を説明する 3~4 文で構成されている -
Description:内のソフトウェア名/パッケージ名/API 名(「R」を含む)が引用符で囲まれているが、関数名は囲まれていない -
Description:で頭字語が初出時にすべて展開されている -
Description:で二重引用符が出版物のタイトルにのみ使われている -
Authors@R:に[cph]ロールを持つ著作権者が含まれている - Posit のパッケージの場合、
person("Posit Software, PBC", role = c("cph", "fnd"), comment = c(ROR = "03wc8by49"))が含まれている - LICENSE の年が現在の提出年と一致している
関数のドキュメント
- エクスポートされるすべての関数に
@returnのドキュメントがある - 意味のある戻り値を持つエクスポート関数すべてに
@examplesがある - コメントアウトされたコードを使っている例のセクションがない
- 本当に必要な場合を除き、例で
\dontrun{}を使っていない - 推奨パッケージが必要な例では、
@examplesIfまたはifガードを使用している - 例を含む非エクスポート関数では、
:::記法または@noRdを使用している
URL とリンク
-
urlchecker::url_check()を実行した - すべての URL が https プロトコルを使用している(http リンクがない)
- リダイレクトされる URL がない(将来の CRAN バッジ URL を除く)
- 将来の URL(CRAN バッジなど)はそのまま残している
- README に
.Rbuildignoreファイルを参照する相対リンクがない
任意(推奨)
- メソッドへの参照に懸念がある場合、
cran-comments.mdに事前の注記を追加した - サードパーティーのファイルを含める場合、同梱ファイルのライセンスを確認した