備忘ログ

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

Rのパッケージ作成関連で最近気付いた(最近知った)ことの雑多なメモ

Rのパッケージ作成関連で最近気付いた(最近知った)ことの雑多なメモ。

R-hubの仕様が変わって、GitHub Actionsで実行する仕様となった

もはや旧聞に属する話だが、Rのパッケージを複数の環境でR CMD Checkを行ってくれる便利サービスだったR-hubの仕様が変更となり、GitHub Actionsで実行する仕様となった。devtoolsパッケージのcheck_rhub()では実行できなくなった。

なお、パッケージのコード管理にgithubを使用していない場合でも利用できるが、結局はgithub actionとして実行されることとなる。

基本的に公式ページに書かれていることだが、日本語で簡素にまとめておく。

r-hub.github.io

以下は、GitHub上でコードを管理していることを前提とする。まずは、rhubパッケージをインストールする必要がある。

install.packages("rhub")

パッケージのgitのクローン環境で、デフォルトのブランチに切り替えてR-hubのGitHub Actionのワークフローを追加する。

rhub::rhub_setup()

これを実行すると、ワークフローが追加される。次にやるべきことは、実行時にメッセージの通り、コードをcommitし、GitHubにpushする。

その後、

rhub::rhub_doctor()

を実行し、すべてOKなら問題なく準備が整っているということ。自分の場合、GitHubアカウントのPAT(Personal Access Token)でGitHub Actionsを実行できる様になっていなくて、設定を少し変えて登録したらOKだった。なんかISSUESも立っていたので結構ここで躓く人は多いんじゃないかと思う。

github.com

しかし、ちゃんとワークフローがリポジトリにpushされていれば、GitHub上で実行できる状態になっていれば、リポジトリのActionsのところからManualで実行する事ができる。

ここで、ワークフローは.github下のディレクトリに格納されるのだが、.githubがワークフローをセットしただけでは.Rbuildignoreに記述されないので、事前にこれを記述しないと必ずFound the following hidden files and directories: .githubと出るので、.githubが初めて書き込まれる場合にはusethis::use_build_ignore(".github")などして.Rbuildignore^\.github$などと自分で記述する必要がある。

rhub::rhub_check()

で実行すると、どのプラットフォーム環境で実行するか聞かれるので、任意の環境を数字で選択するとGitHub Actionsでテストが実行される。GitHub上でマニュアル操作でActionsを実行したときにはLinuxmacosWindowsで実行されるので、特段の理由がなければこれを実行しておけばいいのかと思っている。もちろんC++などを呼び出している場合にはこれらのコンパイルが複数環境でうまくいくか確認が必要かと思う。

ここからは、個人的な所感なのだが、以前はR-hubにCheckのためにパッケージを投稿してもサーバー上で詰まっているのか結果が返ってくるまでかなり待たされるタイミングもあったので、GitHub Actionsで実行されることになり結果が出るまでは基本的には遅延的なのはなく早いのがいい。

一方で気になるのは、GitHub上でコードを管理していない場合には使いづらい点、結果を確認するためにCheckが終わった頃にGitHubにアクセスする必要があること(エラーがあればメールがくることになっているが)。慣れの問題か。

あとは途中で書いたが、.Rbuildignore^\.github$などと自分で記述する必要があるが、usethisパッケージなどだと勝手に.Rbuildignoreに必要なディレクトリやファイルが記載されるのでワークフローをセットした時点で記述してほしいが、

github.com

とISSUESが立っているが対応されていないところを見ると、今のところ自分で書くしかなさそう。

パッケージのexportされていない関数をutilsgetFromNamespace()で呼び出したときには、呼び出した関数が使用しているパッケージも必要

パッケージのexportされていない関数を使いたいときに:::をつかって呼び出すことがあるが、パッケージ作成時に:::をつかって他のパッケージのexportされていない関数を呼び出すと、devtoolscheck()を実行すると:::を使わないでねとエラーが出る。

これを解決する方法として、utilsgetFromNamespace()を使う方法がある。

stackoverflow.com

ちょっとトリックっぽい手法だが、結構いろいろなパッケージで用いられている様子。

このとき、呼び出したパッケージの関数がその中で::などで別のパッケージを呼び出しているときにはその別のパッケージをImportなどに登録していないとdevtoolscheck()`でエラーとなる。注意が必要。

また、後でコードを整理しているときにコード内で::と呼び出していないのにDESCRIPTIONにImportなどで見知らぬパッケージが指定されているときに、なんじゃこりゃ、とわからずに削除するとCheckでエラーが出ることになるのでその後の管理も注意が必要。

CRANに登録されているパッケージにDOIが付与されるようになった

CRANのページを見ていて知ったのだが、CRANに登録さているパッケージにDOIが付与されるようになった模様。

fosstodon.org

CRANのWebページをみていたら下の方のMastodonに書いてあった。

CRANに登録されているパッケージの定期的なCRANチェックでエラーがでてremove候補となった場合に、CRANのパッケージのウェブページに表示されるようになった

CRANに登録されているパッケージはCRANの定期的なCheckでエラーが出ると、メンテナーに修正依頼のメールが来て期日までに修正がなされないとremoveされることになる。

通常、事前にremoveされそうかどうかを知ることはできないが、CRAN Checkの結果を確認するとなんとなくそれっぽいかなということがわかる程度だったが、CRANのウェブページの仕様が変わりいつまでに修正されない場合remove候補になっていることがわかるようになった模様。

mastodon.social

Mastodonを見ていたら見付けた。

パーセントエンコーディングされているURLをRのパッケージのドキュメントに含めるときには、%の前にバックスラッシュをそれぞれつける

R本体はuftネイティブで挙動するようになったが、CRANに登録するパッケージには相変わらず日本などの非ASCII文字は使えない(CRANに登録する予定がなければ特段問題はない)。

[R-pkg-devel] Intrinsic UTF-8 use in aspired CRAN package

ということで、コードの中に日本語がある場合にはいろいろ工夫が必要になる。

で、ReferenceなどでURLで日本語使っているページのURLも結局日本語のままでは当然だめなのでいわゆるパーセントエンコーディングの状態にする必要がある。ただ、そのままだとroxygen2でRdドキュメントを生成したときに、Rd上で%より後ろの部分が破棄されてしまう。

r - Roxygen2: @return mismatched braces or quotes - Stack Overflow

そのため%の文字の前にそれぞれバックスラッシュをいれる必要がある。そうすると、roxygen2でRdドキュメントを生成したときにバックスラッシュが消えた状態でもとのパーセントエンコーディングのURLになってくれる。