0Pricing
R Academy · レッスン

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 builds

DESCRIPTIONファイル

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 LICENSE

use_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 Imports

R/ディレクトリの構成

すべてのソースファイルは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 documentation

man/ディレクトリ

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パッケージ開発における標準的な反復サイクルは次のとおりです。

  1. create_package() — ひな形を一度作成する
  2. use_r('name') — ソースファイルを作成する
  3. 関数を作成し、ドキュメントを記述する(roxygen2)
  4. load_all() — 対話的なテストのためにセッションへ読み込む
  5. document() — man/とNAMESPACEを再生成する
  6. test() — ユニットテストを実行する
  7. 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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. usethis と devtools によるパッケージ構成
  2. roxygen2 による関数ドキュメントの作成
  3. testthat による単体テスト
  4. CRAN への提出とパッケージメンテナンス
← R Academyに戻る