RMarkdownでtargetsパッケージを使って前処理データを引っ張ろうとしたらknitr時にエラーを起こした
この記事はR Advent Calendar 2021 23日目のところに大遅刻して投稿した記事です。
概要
- targetsパッケージとRMarkdownを併用しようとしたらエラーが発生
- RStudioのRMarkdownの設定でチャンク評価時のディレクトリの設定変更を忘れていたせいだった
- targetsパッケージに限らず、プロジェクト内で複数のRMarkdownを1つのフォルダに入れていたりすると引っ掛かりそう
targetsパッケージとは
targetsパッケージは処理フローを管理するためのパッケージ。
最近TokyoRの資料を眺めていて知った。
{targets}でワークフローを管理せよ / Workflow management with targets - Speaker Deck
個人的な推し関数はtar_load()1。
概要だけざっくり書くと、あるデータに対してこれまでは
- 前処理のコードを書いて、
- 前処理をして、
- それぞれrdsファイルとかに保存して、
- ファイルパス指定で読み出して、
- 解析を実施する
みたいな流れの中で、ソースコードやデータの保存・修正・管理にクソ面倒な手順を踏んでいたのが、処理フローの可視化を含めて一括で管理しやすくなるもの。上記フローの2~4までが分かりやすくなるイメージでいいと思う。
割と便利なので、新しい解析データを弄る際にお試しでちょこちょこ使っている。
どんなエラーを踏んだのか
自分の場合、日頃の解析では後でレポート形式にする手間を省くため2、RMarkdown上でコードを書いて検討している。
RMarkdown上でもtargetsは普通に使える3ので、事前に別ファイルのソースコードで前処理した結果をtar_load()で呼び出しつつ解析をしている。
で、解析が一段落したのでknitrボタンで保存しておこうとしたら、tar_load()の部分で以下のようなエラーが発生4。
Error: missing files: _targets/meta/meta
フォルダを見ると普通に存在しているし、チャンク内でコードを動かす分には問題なく読めている。
で、試しにtar_make()をチャンクに入れてknitrしてみると以下のようなエラーが発生。
Error: could not find file _targets.R. Main functions like tar_make() require a target script file (default: _targets.R) to define the pipeline. Functions tar_edit() and tar_script() can help.
knitrする時だけ発生しているので、たぶんRMarkdown関連の設定のどれかが悪さをしていると思われる。
原因
で、RStudioの設定を眺めていたら、思いの他簡単に見つかった。
RStudioの画面上部で「Tools→Global Options...→R Markdown」の順に開いていったところにある「Evaluate chunks in directory」がDocumentになっていた。
この設定を「Project」に変更しておかないとknitr時のディレクトリがRmdファイルのある場所になるため、プロジェクト内の階層構造によってはエラーを起こす5。
実際、「Project」に変更したところ問題なく動き始めた。
結論
プロジェクト内でRMarkdownをファルダ作って管理する場合は設定に注意。
Enjoy!
-
targetsパッケージを使った処理フロー内の任意のデータを環境変数として引っ張ってこれる関数。ファイルパスとか保存場所とかから解放されるので想像以上に快適。↩
-
knitrボタン1つで纏められるおかげで、報告書とかに時間取られなくて本当に助かる。ただしdocx形式で要求されるとかいう特殊な状況は考慮してないので、その場合は死にそうになる。↩
-
tar_read()でも同様に発生。↩
-
データ解析の際はプロジェクトフォルダの中にデータ保存フォルダやRmdファイル用フォルダなど細かく分けているため、以前からここの設定については変更しておいたはずなのだが、年末に色々あってR環境を再構築してた時に事故った模様。↩