usethis と devtools によるパッケージ構成
usethis のヘルパーを使って、パッケージディレクトリ、DESCRIPTION、NAMESPACE のひな形を作成します。
「usethis と devtools によるパッケージ構成」はCoddyKit上の無料R Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。
Rパッケージを作る理由
Rパッケージは、再利用可能なコード、データ、ドキュメントを共有する標準的な方法です。CRANに公開する予定がなくても、コードをパッケージ化することで、ドキュメント付きの関数、ユニットテスト、明確な名前空間といった優れた慣行を徹底できます。devtoolsとusethisを使えば、作業を簡単に進められます。
パッケージのひな形を作成する
usethis::create_package('~/mypackage')は、必要なファイルをすべて含むディレクトリを作成します。必要なファイルは、DESCRIPTION、NAMESPACE、R/ディレクトリです。新しいプロジェクトは自動的にRStudioで開かれます。
# library(usethis)
# library(devtools)
#
# usethis::create_package('~/mypackage')
#
# Creates:
# mypackage/
# DESCRIPTION <- package metadata
# NAMESPACE <- exported symbols (auto-managed by roxygen2)
# R/ <- your R source files
# .Rbuildignore <- files to exclude from package buildsDESCRIPTIONファイル
DESCRIPTIONファイルは、パッケージのマニフェストです。主なフィールドは次のとおりです。
- Title — 1行の説明(タイトルケース、ピリオドなし)
- Version — セマンティックバージョン(例:
0.1.0) - Author / Authors@R — パッケージの作成者
- Depends — 必要なRのバージョン
- Imports — パッケージから呼び出すパッケージ
- License — 例:MIT、GPL-3
# DESCRIPTION example:
# Package: mypackage
# Title: Tools for Analyzing Survey Data
# Version: 0.1.0
# Authors@R: person('Alice', 'Smith', email='alice@example.com', role=c('aut','cre'))
# Description: Provides helper functions for cleaning and summarizing survey responses.
# Depends: R (>= 4.1.0)
# Imports: dplyr, stringr
# License: MIT + file LICENSEuse_r()で関数を追加する
usethis::use_r('my_function')はR/my_function.Rを作成し、編集用に開きます。R/内の各ファイルには、1つの関数、または密接に関連する少数の関数を含めるようにします。パッケージファイル内ではsource()呼び出しを使用しないでください。
# usethis::use_r('add') # creates R/add.R
#
# Write your function in R/add.R:
# add <- function(x, y) {
# if (!is.numeric(x) || !is.numeric(y)) stop('x and y must be numeric')
# x + y
# }
#
# Then document it with roxygen2 comments above the function.devtools::load_all() — 開発ループ
devtools::load_all()(RStudioでのキーボードショートカットはCtrl+Shift+L)は、パッケージのインストールと読み込みをシミュレートします。実際にはインストールせず、R/内のすべてのファイルを現在のセッションに読み込みます。これは反復的な開発サイクルの中心となる処理です。
# Development loop:
# 1. Edit R/add.R
# 2. devtools::load_all() # Ctrl+Shift+L
# 3. add(2, 3) # test interactively
# 4. Go to step 1
#
# load_all() is much faster than install.packages()
# because it skips compilation and installation steps.devtools::check() — 完全な監査
devtools::check()(Ctrl+Shift+E)は、CRANで使用される包括的なチェック一式であるR CMD checkを実行します。ドキュメント、テスト、例、名前空間などを確認します。ERRORは0件、WARNINGは0件、NOTEはできるだけ少なくすることを目指してください。
# devtools::check() # runs R CMD check
#
# Common errors to fix:
# ERROR: Undocumented function 'add' => add roxygen2 docs
# WARNING: No NAMESPACE file => run devtools::document()
# NOTE: No examples => add @examples in roxygen2
# NOTE: Dependencies in DESCRIPTION not used => clean up ImportsR/ディレクトリの構成
すべてのソースファイルはR/に配置します。一般的な規則は次のとおりです。
- 関数の種類ごとに1ファイル(例:
R/utils.R、R/plot_helpers.R) - データセットのドキュメントには
R/data.R .onLoad()と.onAttach()フックにはR/zzz.R
R/内にサブディレクトリは作成しません。すべてのファイルを直下に配置します。
# Typical R/ directory for a small package:
# R/
# add.R <- add() function + documentation
# subtract.R <- subtract() function
# utils.R <- internal helpers (not exported)
# data.R <- documentation for bundled datasets
# package.R <- @docType package documentationman/ディレクトリ
man/には、エクスポートされた各関数につき1つの.Rdヘルプファイルが含まれます。これらを手動で編集してはいけません。devtools::document()がroxygen2コメントから生成するものだからです。ソースと一緒にコミットしてください。
# man/ is auto-generated:
# man/
# add.Rd <- generated from @title, @param etc. in R/add.R
# subtract.Rd <- generated from R/subtract.R
#
# Regenerate with:
# devtools::document() # also updates NAMESPACE
#
# Never edit .Rd files directly -- changes will be overwritten
cat('Always edit roxygen2 comments, never man/*.Rd files directly
')tests/ディレクトリ
usethis::use_testthat()はtests/testthat/ディレクトリを作成し、testthatをDESCRIPTIONに追加します。そのディレクトリ内に、test-*.Rという名前のテストファイルを作成します。devtools::test()(Ctrl+Shift+T)ですべてのテストを実行できます。
# Set up testing:
# usethis::use_testthat()
#
# Creates:
# tests/
# testthat.R <- runner script (do not edit)
# testthat/
# test-add.R <- your test file
#
# Run tests:
# devtools::test()
# devtools::test_file('tests/testthat/test-add.R')依存関係を正しく追加する
パッケージのソースファイル内でlibrary(pkg)を使用してはいけません。代わりに、次のようにします。
usethis::use_package('dplyr')を使い、DESCRIPTIONのImportsにパッケージを追加するpkg::function()で関数を呼び出すか、roxygen2に@importFrom pkg functionを追加する- 例やテストでのみ必要なパッケージには
Suggestsを使用する
# Add a dependency:
# usethis::use_package('stringr') # adds to Imports
# usethis::use_package('ggplot2', 'Suggests') # adds to Suggests
#
# In R/my_function.R:
# clean_names <- function(x) {
# stringr::str_to_lower(stringr::str_trim(x)) # use pkg:: prefix
# }パッケージ開発ワークフローのまとめ
Rパッケージ開発における標準的な反復サイクルは次のとおりです。
create_package()— ひな形を一度作成するuse_r('name')— ソースファイルを作成する- 関数を作成し、ドキュメントを記述する(roxygen2)
load_all()— 対話的なテストのためにセッションへ読み込むdocument()— man/とNAMESPACEを再生成するtest()— ユニットテストを実行するcheck()— R CMD checkを完全に実行する
クイックチェック:DESCRIPTIONのフィールド
パッケージが直接呼び出すRパッケージ(ハード依存)を一覧にするDESCRIPTIONのフィールドはどれですか?
パッケージ構成の振り返り
Rパッケージ開発で使用する主なファイルとコマンドは次のとおりです。
usethis::create_package()— DESCRIPTION、NAMESPACE、R/を含むひな形を作成するDESCRIPTION— Title、Version、Imports、Licenseのメタデータusethis::use_r('name')— R/にソースファイルを追加するdevtools::load_all()— 高速な反復的再読み込み(Ctrl+Shift+L)devtools::document()— roxygen2からman/を再生成するdevtools::check()— 0件のエラーと警告を目標にR CMD checkを完全に実行する- パッケージのソースに
library()を記述しない —pkg::fn()を使用する
よくある質問
「usethis と devtools によるパッケージ構成」レッスンは無料ですか?
はい。「usethis と devtools によるパッケージ構成」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。
「usethis と devtools によるパッケージ構成」で何を学びますか?
usethis のヘルパーを使って、パッケージディレクトリ、DESCRIPTION、NAMESPACE のひな形を作成します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
R Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「usethis と devtools によるパッケージ構成」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このR Academyレッスンでコードを書いて実行できますか?
はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- usethis と devtools によるパッケージ構成
- roxygen2 による関数ドキュメントの作成
- testthat による単体テスト
- CRAN への提出とパッケージメンテナンス