パッケージ開発者が公開データを置く場所は inst/extdata
だが、vignette 執筆中に system.file()
しても自パッケージのデータを読めない?となったので見落としていた確認ポイントをメモしておく。
結論
下記 2 点をやり忘れていないか確認するとよい:
-
package = MY_PACKAGE_NAME
を引数に与える -
devtools::load_all()
する
解説
package = MY_PACKAGE_NAME
を引数に与える
system.file()
の package =
引数のデフォルト値は "base"
なので、自パッケージ名を与えないと base パッケージの inst/extdata
からファイルを検索してしまうため。
devtools::load_all()
する
前提
「インストール」「インポート」「ロード」の違いを理解しておくこと
-
ロード: パッケージがエクスポートしているオブジェクト(関数やデータ)をロードパスに載せる操作。パッケージ開発者は
devtools::load_all()
を使うことで、自パッケージをインストールすることなしにロードできる -
インストール: 一般ユーザーが
install.packages("PACKAGE_NAME")
するのと同じように、開発中のパッケージをインストールパスに置く操作。devtools::install()
などで実行できる -
インポート: インストール済みのパッケージを利用可能にすること。
library(PACKAGE_NAME)
で実行できる。パッケージがエクスポートしているオブジェクトをロードパスに載せる操作なので、パッケージをユーザーとしてロードするための方法とも言いかえられる
R パッケージの vignette では、自パッケージを library("MY_PACKAGE_NAME")
してインポートできる。
これはユーザーに提供する関数を説明するために便利だが、この library()
時に読み込まれるパッケージは、最後に自パッケージをインストールした時の状態なので、下記のような状態では system.file()
してもファイルは見つからない:
devtools::install()
-
inst/extdata/
にファイルを置く -
library(MY_PAKAGE)
する -
sysrem.file("extdata", "THE_FILE", package = "MY_PACKAGE")
する -
library()
でインポート(ロード)されたパッケージは1.
でインストールしたときの状態なので、2.
で置いたファイルはまだロードパスに載っておらず見つからない
パッケージ開発時にはdevtools::load_all()
をこまめにする習慣をつけるとよい。シンタックスエラーを早期発見できるメリットもある。
というか、devtools::install()
は CRAN 提出前の最終確認に使う程度で、ふだんは全く使わなくてよさそう。