Help us understand the problem. What is going on with this article?

Rでパッケージを作ってみる〜きその「き」〜

(注意)
2019年12月現在で、下記の通りに作業した場合に、エラーがいくつか発生する可能性があります。

はじめに

この記事は、Rでパッケージを開発するために必要なパッケージ開発手順に関する自分への備忘録です。R言語のおかげで、今はお仕事ができているようなものなので、Rユーザーが1人でも多く増えて、Rコミュニティがもっと活発になればと思い、作成しました。

内容については随時、「Rパッケージ開発入門」をもとにアップデートしていく予定です。記事の著者がパッケージ開発についてトーシロなので、誤りや誤理解している部分もあります…ごめんなさい。図解多めでステップも意図的に細かくしています。また、文中に、Rパッケージ開発入門で記載されている要点は引用として、組み込みます。

それはさておき、想定読者層は下記のとおりです。

  • Rでパッケージを開発したことがなく、私のように最低限のパッケージの作り方も知らない初学者だが、挑戦してみたい人。

更新記録
2019.03.08 : ver001
2019.05.01 : ver002

パッケージ開発の流れ

  1. Githubアカウントとレポジトリを作る
  2. パッケージのプロジェクトを作る
  3. 説明書を書く
  4. 関数を書く
  5. テストを書く
  6. チェック
  7. Githubにアップする
  8. Rで読み込む

Githubアカウントとレポジトリを作る

下記のGithubのページからアカウント登録して、パッケージに関するソースコードなどを格納するためのリポジトリを作成します。
スクリーンショット 0031-03-08 1.30.33.png

GitHubのアカウント登録からリポジトリ操作までに詳しく一連の操作が書かれています。

パッケージのプロジェクトを作る

Rstudioからパッケージのプロジェクト作成します。

usethis::create_package("{filepath}/{pkgname}")でも作成可能。
Source | Rパッケージ開発入門

001.png

次に、R packagesをクリック。
003.png
※C++を使うのであればR Package using Rcppをクリック。

パッケージの名前を入力します。ここでは四則演算ができるサンプルパッケージを作成するので、shisokuenzanと入力します。また、Create a git repositoryをチェックしておきます。保存先については、おのおの管理したいディレクトリを選択してください。
スクリーンショット_0031-03-08_1_43_16.png

2.1.1 名前の要件
更新な要件が3つあります。名前は文字と数字とピリオドだけで構成されること、文字で始まること、そしてピリオドで終わらないこと。
2.1.2 名前を付ける方法
- 簡単にGoogleで検索できるユニークな名前を選ぶ。ユーザーが資料を検索しやすい。
- 大文字と小文字の両方を使わない。
- 問題を連想させる単語を選ぶ。plyrはapply関数群の一般化であり、plier(ペンチ)を想起しやすい。
- 略語を使用する。Rcpp = R + c++の略語
- 最後にrを追加する。stringrは、string(文字列)を扱うツールを提供する。
Source | Rパッケージ開発入門

create projectをクリックすると、下記の画面に遷移します。
004.png
ここで困るのが、自動で生成されるものがよくわからんということです。詳しくは今後更新していくとして、簡単に説明すると下記のような役割を持つもののようです。

  • .gitignore:Gitで変更履歴を記録しないファイル
  • .Rbuildignore:パッケージをビルドするときに無視するファイルで、とくに変更しない。
  • DESCRIPTION:パッケージの説明書
  • man:パッケージのヘルプのもととなるファイルで、roxgen2パッケージで自動生成されるのでとくに変更しない。
  • NAMESPACE:パッケージの依存関係などが書かれるファイルで、roxgen2パッケージで自動生成されるのでとくに変更しない。
  • Rフォルダ:ここに.Rファイルを保存する。

説明書(DESCRIPTION)を書く

DESCRIPTIONを開いて、中身を変更していきます。DESCRIPTIONの良き例としてdplyrのDESCRIPTIONをリンクしておきます。DESCRIPTIONで基本的に変更するべき点は下記の通りです。

  • Title
  • Author
  • Maintainer
  • Description
  • Depends: Rのバージョン
  • Imports
  • Suggests

shisokuenzanパッケージのDESCRIPTIONはこんな感じ。
005.png

4.1 依存パッケージには何が必要か
Importsは、パッケージの動作に必要なものが記載され、Suggestsには、必ずしも動作に必要ではないパッケージが記載される。つまり、依存関係の強さが異なる。Importsに記載されているパッケージがまだインストールされていなければ、コンピュータにnインストールされることになります。(library(x)ではない。)
Source | Rパッケージ開発入門

関数を書く

DESCRIPTIONを書き終えましたら、関数を書いていきます。ここがいつもの関数作成とは異なる部分です。roxgenコメントと呼ばれるコメントを一緒に記述していくことで、.Rファイルを構築します。roxgenコメントの各項目は下記の役割を持ちます。

  • @param [param] [description]:引数の説明
  • @importFrom [package] [func]:外部パッケージを読み込む。usethis::use_package("name")を実行することでDESCRIPTIONに依存パッケージが記述される。
  • @examples:関数の使用例
  • @export:ユーザーが使う関数。パッケージ内部の処理で使用する関数なら必要なし。

shisokuenzanパッケージはこんな感じ。roxygenコメントの1行目に、そのオブジェクトがどのような役割を果たすかを1行で記述します。これが、ヘルプページのタイトルになります。
006.png

.Rファイルを保存したらコンソールでdevtools::document()を実行します。そうすることでmanフォルダ内にデータが生成されます。
007.png
manフォルダ内
008.png

テストを書く

関数が予想通りに動作するかテストします。コンソールでusethis::use_test()を実行します。実行することで、テストに必要なものを自動で生成してくれます。
009.png

テストの良き例としてdplyrのbetweenのテストをリンクしておきます。shisokuenzanパッケージはこんな感じ。
スクリーンショット 0031-03-08 2.19.37.png

チェック

コンソールでdevtools::check()を実行します。自動で、ファイル構成、DESCRIPTIONなどもろもろに問題がないかチェックしてくれます。error、
warning、noteが出力されるので、内容に応じて修正して再度チェックする。
011.png

ドキュメントを書く

コンソールでusethis::use_readme_rmd()を実行するとREADME.Rmdが作られるので、.Rmdファイルにパッケージの説明を書いていきます。良き例としてdplyrのドキュメントをリンクしておきます。shisokuenzanパッケージはこんな感じ。
スクリーンショット 0031-03-08 2.36.08.png

Githubにアップする

ここまで完了したら必要なものをGithubのパッケージ用に用意しておいたリポジトリにプッシュします。
スクリーンショット 0031-05-01 15.02.19.png

Rで読み込む

devtools::install_github("Sugiura1989/shisokuenzan")でパッケージを読み込みます。下記のとおり、問題なく動作しました。
013.png

まとめ

パッケージ開発の流れはこのような感じ…だけど、まだ各ファイルが果たすべき役割などなど理解できていない点は多々あります。ここらへんは実際にパッケージを開発していくなかで、調べつつ修正していければと思います。

お礼

この記事は、Twitter上でRのパッケージ開発についてつぶやいたところ、@R_by_Ryoさん、@y__mattuさん、@kato_kohakuさん、@hikaru1122さん、@TA25140989さんより情報、資料を提供いただくことで、作成できました。この場をお借り致しまして、再度、お礼申し上げます。ありがとうございました!!

参考資料

SessionInfo

R
 devtools::session_info()
Session info ------------------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.5.2 (2018-12-20)
 system   x86_64, darwin15.6.0        
 ui       RStudio (1.1.447)           
 language (EN)                        
 collate  ja_JP.UTF-8                 
 tz       Asia/Tokyo                  
 date     2019-03-08                  
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away