知らない人もいるかもなので、まず「#|
を使ってチャンク内にチャンクオプションを書く」とは?、という話から。
knitr 1.35から、チャンクオプションをチャンク内に書く記法がサポートされた。 Quarto だけじゃなくて R Markdown でも使える。
これはどういうことかというと、
```{r eval=FALSE}
実際のコード
```
というのを
```{r}
#| eval: false
実際のコード
```
と書けるようになった。
FALSE
ではなく false
と書いていることに察しのいいひとは気付いたかもしれない。
そう、この新しい記法はYAML。そこで気になるのは、これまで、
```{r fig-cap: !expr paste("Air", "Quality")}
実際のコード
```
みたいな感じで R のコードを直接書いてたやつはどうなるの?、という点。これは、R Markdown の YAML front と同じく !expr
を使うことになる。
```{r}
#| fig-cap: !expr paste("Air", "Quality")
実際のコード
```
ただ、この書き方、R Markdown だといけるのに Quarto だとなぜかエラーになった。
ERROR: YAMLError: unknown tag !<!expr> at line 1, column 39: ... p: !expr paste("Air", "Quality")
Quarto のドキュメントにも書かれている書き方なのになぜ...?、と思ったら、すでにバグ報告されて最新の Quarto では直っていた。
RStudio には Quarto が同梱されていて、デフォルトだとそれが使われる。その同梱版がまだバグが直っていないバージョンだったからこういう問題が起こっていたっぽい(RStudio 2022.02.2 Build 485)。 以下から daily build 版の Quarto がダウンロードできるので、これをインストールすれば直った。ということで、次のバージョン(2022.6)ではたぶんもう起こらない問題のはず。
あともうひとつ引っかかったのは、 !
ではじまるコードはだめらしい、という点。
こんな感じで、ファイルがまだ手元にない時だけダウンロードしてくる、みたいなコードを書きたかったけど、
```{r}
#| eval: !expr !fs::file_exists(data_file)
````
これは YAML の文法上だめらしくてエラーになる。
ERROR: YAMLException: duplication of a tag property (1:13) 1 | eval: !expr !fs::file_exists(data_file) -----------------^
正しい解決策なのかわからないけど、とりあえず ()
で囲めば動いた。
```{r}
#| eval: !expr (!fs::file_exists(data_file))
````
追記:eitsupiさんにクオートで囲めばいいと教えてもらいました。ありがとうございます。
```{r}
#| eval: !expr '!fs::file_exists(data_file)'
````
要は!expr
の後にくるのは文字列で、それがRのコードとして評価される、ということ。なので、逆に言うとこういうのはエラーになる。
```{r}
#| fig-cap: !expr "foo"
````
Quitting from lines 25-33 (test.qmd) Error in eval(x, envir = envir) : object 'foo' not found Calls: .main ... eval_lang -> in_input_dir -> in_dir -> eval -> eval Execution halted
YAML 奥が深いですね...