14.8 コードチャンクにラベルの重複を許可する (*)

knitr はデフォルトでは文書内でチャンクラベルが重複することを許可しません. 重複するラベルは文書を knit する際にエラーを引き起こします. これは文書内でコードチャンクをコピーアンドペーストするときに最もよく起こります. あなたもこのようなエラーメッセージにでくわしたことがあるかもしれません.

processing file: myfile.Rmd
Error in parse_block(g[-1], g[1], params.src, markdown_mode) :
  Duplicate chunk label 'cars'
Calls: <Anonymous> ... process_file -> split_file -> lapply ->
  FUN -> parse_block
Execution halted

しかし, 重複するラベルを許可したいこともあるというものです. 例えば親文書 parent.Rmd があり, その中で子文書を複数回 knit すれば, 失敗するでしょう.

# 設定
settings <- list(...)

# 1度目の実行
knit_child("useful_analysis.Rmd")

# 新しい設定
settings <- list(...)

# 再実行
knit_child("useful_analysis.Rmd")

この筋書きでは, 子文書が knit される前に R のグローバルオプションを設定することでラベルの重複を許可できます.

options(knitr.duplicate.label = "allow")

子文書ではなくメインの文書でラベルの重複を許可したいなら, knitr::knit() が呼び出される前に設定しなければなりません. それを実現する可能性の1つとして, ~/.Rprofile ファイル内で設定するという方法があります (詳細は ?Rprofile のヘルプを見てください).

このオプションの設定は注意深くすべきです. ほとんどのエラーメッセージは, それなりの理由があってこそ存在します. 重複するチャンクを許可することは図や相互参照に関して気が付かないうちに問題を生み出す可能性があります. 例えば, グラフ画像のファイル名はチャンクラベルによって決まるので, 2つのコードチャンクが同じラベルを持ち, かつ両方のチャンクが図を生成しているなら, 理論上はこれらの画像ファイルは互いに上書きすることになります (そしてエラーも警告も発しません). knitrknitr.duplicate.label = "allow" オプションがあると, 重複するラベルに暗黙に数字の接頭語を追加して変更しています. 例えば, 2つのコードチャンクに対してはこうなります.

```{r, test}
plot(1:10)
```

```{r, test}
plot(10:1)
```

2つ目のラベルは暗黙のうちに test-1 に変更されます. これはラベル test のチャンクからのグラフ画像を上書きすることを回避するかもしれませんが, 同時にチャンクラベルが予想できなくなります. ということは, 図の相互参照 (4.7節参照) も相互参照がチャンクラベルに基づいているので難しくなるでしょう.