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.

第二次运行输出

针织输出

4

2 回答 2

19

推测:

这是正在发生的事情。

knitr非常明智地在创建对象后立即缓存它们。然后,只要检测到它们已被更改,它就会更新它们的缓存值。

但是, data.table绕过了 R 的正常的按值复制分配和替换机制,并使用:=运算符而不是 a =, <<-, or <-。结果knitr没有接收到DT由 改变的信号DT[, c:=5]

解决方案:

只需将此块添加到您希望DT重新缓存当前值的任何地方。它不会花费您任何内存或时间(因为除了引用之外没有任何内容被复制),但它确实有效地向已更新的knitrDT <- DT发送(假)信号: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 回答
11

正如 Josh O'Brien 回答下的第四条评论所示,我添加了一个新的块选项cache.vars来处理这种非常特殊的情况。在第二个缓存块中,我们可以指定cache.vars='DT'这样knitr将保存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, cache.vars='DT'}
DT[, c:=5] 
```
Then we display that in a non-cached block
```{r, cache=FALSE}
DT
```

无论编译多少次,输出都是这样的:

knitr 现在与 data.table 一起使用

于 2013-04-08T01:20:09.173 回答