19

これは精神的にこの質問に関連していますが、メカニズムは異なるに違いありません。

knitr割り当てを含むチャンクをキャッシュしようとするdata.table :=と、そのチャンクが実行されていないかのように動作し、後のチャンクは:=.

これはなぜですか?オブジェクトの検出はどのようknitrに更新され、何がdata.table混乱を引き起こしているのでしょうか?

を実行することで、これを回避できるようですDT = DT[, LHS:=RHS]

```{r}
library(data.table)
```
Data.Table Markdown
========================================================
Suppose we make a `data.table` in **R Markdown**
```{r, cache=TRUE}
DT = data.table(a = rnorm(10))
```
Then add a column using `:=`
```{r, cache=TRUE}
DT[, c:=5] 
```
Then we display that in a non-cached block
```{r, cache=FALSE}
DT
```
The first time you run this, the above will show a `c` column, 
from the second time onwards it will not.

2 回目の実行での出力

ニット出力

4

2 に答える 2

19

投機:

ここに何が起こっているように見えるかです。

Knitrは、オブジェクトが作成されるとすぐに、非常に賢明にキャッシュします。次に、変更されたことを検出するたびに、キャッシュされた値を更新します。

ただし、 data.tableは、R の通常の値によるコピーの代入および置換メカニズムをバイパスし、 、、または:=ではなく演算子を使用します。その結果、knitrはによって変更されたシグナルを取得していません。=<<-<-DTDT[, c:=5]

解決:

DTの現在の値を再キャッシュしたい場所に、このブロックをコードに追加するだけです。メモリや時間のコストはかかりません (参照以外は何もコピーされないため) が、更新されDT <- DTた (偽の) シグナルをKnitrに効果的に送信します。DT

```{r, cache=TRUE, echo=FALSE}
DT <- DT 
```

サンプルドキュメントの作業バージョン:

この編集されたバージョンのドキュメントを実行して、動作することを確認します。

```{r}
library(data.table)
```
Data.Table Markdown
========================================================
Suppose we make a `data.table` in **R Markdown**
```{r, cache=TRUE}
DT = data.table(a = rnorm(10))
```

Then add a column using `:=`
```{r, cache=TRUE}
DT[, c:=5] 
```

```{r, cache=TRUE, echo=FALSE}
DT <- DT 
```

Then we display that in a non-cached block
```{r, cache=FALSE}
DT
```
The first time you run this, the above will show a `c` column. 
The second, third, and nth times, it will as well.
于 2013-03-08T17:14:32.787 に答える