14.2 オブジェクトが作られる前に使用する (*)

knitr 文書内の全てのコードは, コードチャンクとインライン R コードも含めて, 最初から最後まで順番に実行されます. 理論上は, 値が代入される前の変数を使うことができません. しかし場合により, 文書内で変数の値により早く言及したいことがあるでしょう. 例えば論文の中で結果を概要欄に掲載したいというのはよくある状況ですが, 実際には結果は文書のもっと後で計算されます. 以下の例はそのアイディアを具体化したものですが, 実行はできません.

---
title: 重要なレポート
概要: >
  この分析では `x` の平均値が
  `r mx` であった.
---

我々は次のチャンクで `mx` を作成した.

```{r}
x <- 1:100
mx <- mean(x)
```

この問題を解決するには, オブジェクトの値がどこかに保存され, 文書が次回コンパイルされる時に読み込まれなければなりません. これは, 文書が最低でも2回コンパイルされなければならないという意味であることに注意してください. 以下は saveRDS() 関数を使った, 実行可能な解決策の1つです.

```{r, include=FALSE}
mx <- if (file.exists('mean.rds')) {
  readRDS('mean.rds')
} else {
  "`mx` の値はまだ利用できない"
}
```

---
title: 重要なレポート
概要: >
  この分析では `x` の平均値が
  `r mx` であった.
---

我々は次のチャンクで `mx` を作成した.

```{r}
x <- 1:100
mx <- mean(x)
saveRDS(mx, 'mean.rds')
```

最初のコンパイルでは, 概要に「mx の値はまだ利用できない」という文言が現れます. その後, もう1度コンパイルすると mx の値が現れます.

knitr::load_cache() 関数はもう1つの解決策で, 特定のコードチャンクでキャッシュ済みのオブジェクトから値を読み込むことできます. このアイディアは上記の例と似ていますが, オブジェクトが自動でキャッシュデータベースに保存されるため, オブジェクトを手動で保存して読み込む手間を省くことになります. あなたは load_cache() で読み込むだけでいいのです. 以下は単純化した例です.

---
title: An important report
abstract: >
  この分析では `x` の平均値が
  `r knitr::load_cache('mean-x', 'mx')` であった.
---

我々は次のチャンクで `mx` を作成した.

```{r mean-x, cache=TRUE}
x <- 1:100
mx <- mean(x)
```

この例では, チャンクラベル mean-x をコードチャンクに追加し, それを load_cache() 関数に渡します. そしてチャンクオプション cache = TRUE でチャンクをキャッシュしています. このコードチャンクの全てのオブジェクトはキャッシュデータベースに保存されます. 繰り返しになりますが, オブジェクト mx はキャッシュデータベースから正しく読み込まれるには, この文書を最低でも2回コンパイルしなければなりません. mx の値が将来も変更される予定がないなら, 文書をこれ以上コンパイルする必要はありません.

もし load_cache() の第2引数でオブジェクト名を指定しないなら, キャッシュデータベース全体が現在の環境に読み込まれます. そうすると, 文書の後方でオブジェクトが作成される前でも, キャッシュデータベースにあるどのオブジェクトも使えます. これが例です.

knitr::load_cache("mean-x")
x  # the object `x`
mx  # the object `mx`