0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[R] vignette から inst/extdata/ 配下のデータが読めない?となったときに確認すること

Last updated at Posted at 2025-02-08

パッケージ開発者が公開データを置く場所は 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() してもファイルは見つからない:

  1. devtools::install()
  2. inst/extdata/ にファイルを置く
  3. library(MY_PAKAGE) する
  4. sysrem.file("extdata", "THE_FILE", package = "MY_PACKAGE") する
  5. library() でインポート(ロード)されたパッケージは 1. でインストールしたときの状態なので、2. で置いたファイルはまだロードパスに載っておらず見つからない

パッケージ開発時にはdevtools::load_all() をこまめにする習慣をつけるとよい。シンタックスエラーを早期発見できるメリットもある。
というか、devtools::install() は CRAN 提出前の最終確認に使う程度で、ふだんは全く使わなくてよさそう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?