備忘ログ

チラシの裏的備忘録&メモ

CRANにパッケージを登録したのでその思い出をメモしておく

Rでアラビア数字を漢数字に変換する{arabic2kansuji}をCRANにパッケージを登録し、その後バグフィックスして更新したのでそこでやったこと(思い出)をまとめておこうと思う。

こんな時系列でやったというだけで、こうやるのがベスト・プラクティスというものではない。ただの思い出日記。

CRANへの投稿手順で最近のものならAtusy氏のCRAN にパッケージを初投稿する手順 | Atusy’s blogが大変参考になるし、実際めちゃくちゃ参考にした。

Rのパッケージの作成法には直接は触れない。主にRのパッケージが一通りできてから、CRANに登録するまでの思い出。

Rパッケージを作る

Hadley著のR packages(日本語版)(以下R Packagesはこの本のことを指す)など書籍やググるとヒットする先人のまとめたものを参考にしながらパッケージを作成した。

最初はCRANに登録することなど考えていなかったので、Policyも確認せずに適当に作っていた。1

R packagesのパッケージのリリースを読む

もともとCRANにパッケージを登録するつもりがなかったが、{zipangu}にPull Requestしたいコードで{arabic2kansuji}を使いたい案件が出てきたので、パッケージをCRANに登録することとした。2

とりあえず、CRANにパッケージを登録する流れを知るためにR packagesのパッケージのリリース(日本語版)を読んだ。ついでにもう一度P Packages全体を再読した。各章の最後に、CARNに登録するなら……という項があり、この項目が参考になった。

これに併せてコードやDescriptionを修正した。

CRAN Policiesを読む

R Packagesにも書いてあるが、やはり一度はCRAN Policiesを通読しておかなければと思い、読んでみた。

そんなに長くないのですぐ読めるが、とかく読みにくい。

例えばわかり易い例だと、

Packages should be named in a way that does not conflict (irrespective of case) with any current or past CRAN package (the Archive area can be consulted), nor any current Bioconductor package.

なんていうのはCRANとBioconductorに登録されているパッケージと同じ名前のパッケージは使えないよ、ということなんだけどconflictとか言われると、たぶんR的には名前空間のことなんだろうけどちょっとわかるけどわかりにくい。3

これはまだわかり易い例なのだけれど、その他、英語力が無いためにわからないのか、Rやプログラミングの理解が不足している(上記であれば名前空間のことがわからないとconflictとか言われてもよくわからないと思う)ためにわからないのかよくわからない文章が多々あって大変だった。

でこのPolicyを理解できた範囲でコードを修正した。

devtools:check*()をやる

CRANにsubmitする前には、複数環境(WindowsLinuxや)でテストするようにとR Packagesを始め色んな所に書かれており、そのためのサポート環境がある。具体的にはdevtools::check()devtools::check_rhub()devtools::check_win_release()をそれぞれ実行する。

devtools::check_rhub()devtools::check_win_release()はそれぞれDescriptionのメールアドレスは本当にあなたのって聞いてきて、そのメールアドレス宛に結果を送ってくるのでここまでに正しいメールアドレスにしておかなければいけない。

Rのコード以外(C++など)を含んでいないので、どの環境でもdevtools::check()がOKなら行けるだろうと思ったが、devtools::check_win_release()は細かいところまでcheckしてくれて、タイトル修正したほうがいいよとかDescription内にあるkansujiという単語がスペルミスじゃない?って教えてくれてよかった。

教えてくれた情報をもとにコードを修正して、修正できない点(kansujiがミススペル疑い)はつぎのcran-comments.mdにミススペルじゃないよって書くことにした。

cran-comments.mdを作る

cran-comments.mdは要するにCRANのパッケージチーム向けのcheck結果の要約をしたためるもので、問題なくcheck通っているなら特に書くこと無いけど、初回投稿の場合は初回投稿だよっていうNOTESがつくのと、今回の場合はkansujiミススペル疑惑があったのでその旨を書く必要があった。

どうやって書こうかなぁって思っていろいろ調べていたら、usethis::use_cran_comments()cran-comments.mdの雛形ができる(し.Rbuildignoreに加えてくれる)ことを知った。4

できた雛形に、「kansujiはミススペルじゃないよ、日本語だよ。」と書いた。

どんなふうに書くといいのかわからなかったからGitHubでcran-comments.mdって検索して、Commitsのところでcran-comments.mdが新しくcommitされたところを見てどんなふうに書いてるのか調べて雰囲気を掴んだ。

初投稿

R Packages曰く、初投稿のときはdevtools::release()を実行するようにとのことで実行した(再投稿のときはdevtools::sbumit_cran()でいいと書いていた)。

いろいろ聞かれて、ちゃんとチェックしていればイエスと答えて、チェックしていなければもう一回やり直すという作業を行った。

といっても、usethis::use_readme_rmd()で作ったREADME.mdが.Rbuildignoreに登録されてるけど、最近のCRANだとREADME対応してるよって教えてくれたから.Rbuildignoreを修正したくらいだったと記憶している。5

投稿するとすぐに、「あなたCRANにパッケージをsubmitした?」ってメールが来るのでリンクをクリックしてsubmitしたよと承認する。

投稿結果

投稿結果は10日以内にメールが来ることになっているらしい。

今回は1/4の20時ころに「あなた投稿した?」というメールがあり、承認したらすぐ後にCRANが受け付けたよとパッケージのDescriptionの内容とcran-comments.mdに書いた内容の返信ががあって、1~2時間後にCRANがWin builderでcheckした結果がメールで来て、1/5の18時ころに「Thanks, on its way to CRAN.」とメールが来て、投稿から正味一日でCRANに登録となった。

これで、CRANに登録され、install.packages()でインストールできるようになった。6

登録完了から3日後にパッケージのWindows用のバイナリ版できたよってメールが来た。しかしもともとコンパイル不要なパッケージなので、不要といえば不要だなあと思った。全パッケージでWindowsのもろもろめんどくさい現象を回避するためバイナリビルドの技だと思うので甘受しておく。

BUG FIX

自分で使っているとバグを見つけやすい。というかこんなニッチなパッケージは需要がないので自分で使っていかないと永遠にバグが残り続ける。

投稿直後に自分で使っていてバグを見つけてしまった(変換できない大きな値(1垓以上)はNAを返すことにしていたが、10垓以上の値でNAではなく計算途中で終了したというエラーがでる)。

あとは諸々誤字脱字など……。

しかし、R Packagesによると頻繁なsubmitはCRANに嫌がられると書いてあるし、こんなでかい値を入れる人もいないだろうし、そもそもこのエラーはR側が大きすぎる値を正確に扱えていないせいだからそんな値をRで使うひとがそもそもいないだろうし……などと言い訳を考えながらコードを修正し、とりあえずGitHub上のリポジトリで修正版をReleaseした。

修正版の再投稿

満を持してCRANへの初回投稿から1ヶ月経過したので修正版のバージョンを0.1.1に上げて、checkも終えてCRANに今度はdevtools::sbumit_cran()で投稿した。質問項目が少なくて逆に不安になるが、ちゃんと投稿承認用のメールがきてことが進んでいった。

軽微な修正だったためか、そもそもバージョンアップはそういう対応なのかわからないが、修正版の投稿から約20分程度で「thanks, package arabic2kansuji_0.1.1.tar.gz is on its way to CRAN.」とメールが返ってきて修正版がCRANに登録された。

所感

CRANに投稿するのは大変だったところと思ったよりも簡単だったところがあった。

思ったよりも簡単だったところ。

  • いろいろなドキュメメントを読むと流れがわかるのでその流れに併せてやると意外と簡単だった。
  • こんなニッチなパッケージ投稿してもいいのか?と思ったが、さっと受け付けられてよかった(?)。7

大変だったところ。

  • 英語のドキュメントを整えるのがめんどくさかった(初回投稿時ひどい誤字脱字があった)。
  • 英語のドキュメントを読むのが大変だった(英語力不足なのかR力不足なのか)。

そんなところ。

CRANにパッケージが登録されると達成感はかなりある。ただ、色々めんどくさいことが多いのと、CRANにパッケージを登録すると同じ名前を使えないということは自分が適当に名前をつけると後の人(他の人)が困るということもありえるので、必要があればCRANに登録するもの難渋するほどじゃないからいいけど、あえずGitHubでいいかなって気持ちが新たになった。

蛇足としては、plm の cipstest (CIPS検定) の実装の問題 - ill-identified diaryでill-identified氏も書いているが「パッケージが CRAN に登録されていることは品質保証に合格したことを表すわけではない」ということを自分で作ったパッケージをCRANに投稿・登録する作業を通して実感した。CRANも日々大量のパッケージがsabuimttされている中でボランティアで回りしているみたいなので、多分CRANとしてはパッケージの細かい(英語の誤字脱字を含めて)ところまでは確認されておらずPolicy違反がなく、簡単な挙動チェックとしてはexamples(とtestがあれば)を実行して問題なければOK的な感じなのかなと思った。


  1. ネット上にある資料をみると多くのものでCRAN登録は大変だと書いてあり、パッケージ公開はGitHubでいいじゃんという記述の資料が多い印象だった。

  2. {zipangu}Issueでコードを提案したときに、uribo氏に「{arabic2kansuji}はCRANに登録する予定はないでしょうか。」と言われた文言を勝手に「CRAN登録してみたら?」と言われた(提案された)と解釈(読み違えた)した。

  3. Policyだから厳密にってことでこうなってるんだろうとはわかる。

  4. {usethis}パッケージは細かいところがよくわからない。Licenceの雛形作ったり、README作ったりしてくれるときしか今まで使ってなかった。多分、このパッケージを使いこなせるとコードとドキュメメントを書く以外の作業は大幅に短縮できそうな気がする……。あとで自分用に分かる範囲でまとめる……まとめたい……。

  5. 今はusethis::use_readme_rmd()でREADME.mdを作っても.Rbuildignoreに登録されないのでusethis前のバージョンのときに実行したからだと思う。いつ更新したかは覚えていない。

  6. 実際にはちょっと時間をおいて自分が使っているCRANのミラーサーバーにもパッケージが登録されたころ。

  7. そういえば、Rの教科書的なのだと教科書用のデータセットをCRANに登録しているからインストールしてねって書いてることもあるから、こんな本を読んでる人だけ向けの異様にニッチなパッケージもあるから大丈夫なんだろうけど。あんまりニッチなパッケージだったら今どきはGitHubにパッケージ公開されることが多いと思うけど。