趣旨
先日はじめてパッケージを作ったのですが、これが紆余曲折あり、色々混乱したトコロもあったので、折角の機会にそれを整理しておきました。
FAQ的なやつになってるといいなーーって思います。
ちなみに作ったパッケージはこちらです。(宣伝)(ニッチな需要)
【R】 文章内で「和暦⇒西暦」に変換するパッケージ作った。 - Qiita
1. パッケージの作り方がわからん!!
いや最初それかーいと言われそうですが、まあ実際に未経験の状態でパッケージを作るのは難しかったです。
作り方をココで解説しても仕方がないのですが、折角なので何度も参照させて頂いた有難いページたちをご紹介しておきます。
これらを見ながら作ったら、素人の僕でもとりあえずの形になりました。
エッセンス以上のことまで網羅的に知りたい方はコチラがよいかも。
- R の拡張を書く (Writing R Extensions) ※情報は少し古いですが、大筋は変わっていないはずです。
- R Packages ※羽鳥著でおすすめ。ただし英語サイト。
- Practical R Package Development (Japanese)
2. コードの中で日本語を使いたい!!
コードの中に日本語を入れるのは避けるべきなのは分かってはいるつもりなのですが、テキスト処理(しかも日本語の文書が対象)のパッケージを作ろうとすると、どうしてもコードにある程度コードに日本語を入れざるを得ない。
とはいえ、日本語を入れた状態でパッケージをチェックさせるとエラーが出る・・・。
というときは、とりあえずコードの中の日本語を全部ASCIIに変換しましょう。
変換にはstringi::stri_escape_unicode()
が便利です。
なんかよく分からなかったけど、エラー文読んでそう解釈したら通ったので、この方法で多分大丈夫。
# こういう関数は
if (hoge == "年") {
fuga(hoge)
}
# こう直すとよい
if (hoge == "\u5143") {
fuga(hoge)
}
3. 外部ファイルを参照させたい!!
正直一番よく分からなかったのがコレ。
この記事が一番参考になりました。
Rパッケージ開発時に利用するデータの種類とその使い分け - cucumber fles
超要約すると・・・
-
usethis::use_data()
を通して関数内で使える「オブジェクト」を保存できる。csv等を関数内で利用したい場合も、一旦オブジェクト(.Rda
ファイル)として保存しておけば間違いない。 - 上記のオブジェクトは、
internal
引数の設定次第でユーザーが参照できるか否か決められる。 - オブジェクトの原ファイル (*.csvなど)を保存?したい場合は、
usethis::use_data_raw()
を使う。
(僕補足: 基本的に関数内では原ファイルを直接参照することはできないと考えていい。)
とまぁこんな感じで、基本的にはusethis::use_data()
を使えばよい。はず。
※なお、元記事ではそれぞれdevtools::use_data()
、devtools::use_data_raw()
と書かれてますが、どうやら一部の関数は{devtools}
から{usethis}
に移植されたみたいです。
コレを知らなかったので、「そんな関数、{devtools}
にはねぇよバーカ!」という旨のエラーを死ぬほど頂戴しました。
r - devtools::use_data( , internal =TRUE) - Stack Overflow
4. 何度チェックさせてもエラーが出る!!
パッケージのチェックを行うdevtools::check()
を走らせた際に、僕が引っかかったポイントを列挙しておきます。
参考ページがある場合は併せて記載しておきます。
-
DESCRPITIONの必須項目が書かれていない。
- DESCRIPTIONには必ず記載しなければならない項目があるようです。それを抜かすとエラーを返されてしまいました。
-
DESCRIPTIONファイルを紐解く - Qiita
- roxygenの書き方が正しくない
-
roxygenとDESCRIPTIONの内容が整合していない
- 例えばスクリプトファイルに
#' @importFrom stringr str_c
と書いたのに、
DESCRIPTIONにImports: stringr
と書いていないと、整合がない旨のエラーが飛んでくる。
- 例えばスクリプトファイルに
-
シンプルにコードがおかしい
-
devtools::check()
を走らせると実行結果として問題点を指摘されるので、一つ一つ潰しましょう。
-
-
コードに日本語が混入している
- 『2. コードの中で日本語を使いたい!!』を参照。
ASCIIに変換して再チャレンジ。
- 『2. コードの中で日本語を使いたい!!』を参照。
-
読み込む外部ファイルの文字コードがおかしい
-
read.csv("hoge.csv", fileEncoding = "UTF-8-BOM")
のように、文字コードを正確に指定しておくほうが無難。 - とくに、UTF-8の場合、BOMの有無に注意。
ExcelでUTF-8の.csvを作成すると、基本的にBOM有になる。
-
-
データセットを
.Rda
に変換したが、なんか崩れてる(たぶん文字コードとかのせい)- 保存した
.Rda
をRStudioで開いて確認してみましょう。
- 保存した
エラーではないが・・・
コードの見直しついでに、余裕があれば『コーディングルールの確認』『処理の高速化』も視野に入れるましょう。
コーディングルール
一言で言えば、口語を文語に書き換えるような感じ。
ちゃんとお作法に則って書きましょう、ということです。
Rのコーディングルールについて
Rでコーディングスタイルを適用させる方法 - INPUTしたらOUTPUT!
処理高速化
基本的に、処理が長ければ長いほど、関数の処理時間も長くなります。
なるべく無駄なく、重複なく、スマートに書くほうが良いです。
例えば、for構文を使うよりも、並列処理させるほうが早いと言われてます。
Rの高速化
かくいう僕は、そんな余裕なくてやりませんでした。
5. 公開方法がわからん!!
GitHubに公開レポジトリを作成してアップロードしておけばよいです。
RstudioでRパッケージを作ってみる 3 ~パッケージ配布~ - Qiita
Gitが使えるに越したことはないけど、仮にGit使えなくても、OneDriveとかGoogle Driveの感覚で、とりあえずディレクトリの中身ごとぶち込めば多分大丈夫(未検証)。
おわりに
パッケージを1つ作った感想は、とにかく達成感がスゴい!!!!
エラーが全部解消された状態になった時は、かなり嬉しかったです。
あと、パッケージのありがたみ。
自分の作ったパッケージは大したものでもないのに、こんなに迷った点があったので、それをいくつも作ってる人はやっぱすげぇな、と。
というわけで、パッケージ作りの参考になったら幸いです。
おしまい。