メモ:Quartoで #| を使ってチャンク内にチャンクオプションを書く時に !expr がエラーになった(がもう直っている)

知らない人もいるかもなので、まず「#| を使ってチャンク内にチャンクオプションを書く」とは?、という話から。

knitr 1.35から、チャンクオプションをチャンク内に書く記法がサポートされた。 Quarto だけじゃなくて R Markdown でも使える。

これはどういうことかというと、

```{r eval=FALSE}
実際のコード
```

というのを

```{r}
#| eval: false

実際のコード
```

と書けるようになった。

FALSE ではなく false と書いていることに察しのいいひとは気付いたかもしれない。 そう、この新しい記法はYAML。そこで気になるのは、これまで、

```{r fig-cap: !expr paste("Air", "Quality")}
実際のコード
```

みたいな感じで R のコードを直接書いてたやつはどうなるの?、という点。これは、R MarkdownYAML 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 奥が深いですね...