这在精神上与this问题有关,但在机制上必须不同。
如果您尝试缓存包含data.table
:=
分配的knitr
块,那么它的行为就像该块尚未运行一样,并且以后的块看不到:=
的影响。
知道为什么会这样吗?knitr
是如何检测对象已经更新的,data.table
做了什么让它困惑的事情?
看起来你可以通过执行DT = DT[, LHS:=RHS]
来解决这个问题。
示例
```{r}
库(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.
第二次运行时的输出
发布于 2013-03-09 01:14:33
推测:
以下是似乎正在发生的事情。
一旦对象被创建,knitr就会非常明智地缓存这些对象。然后,每当检测到它们被更改时,它都会更新它们的缓存值。
但是,data.table绕过了R的常规按值复制赋值和替换机制,并使用:=
运算符,而不是=
、<<-
或<-
。因此,knitr没有接收到DT
已被DT[, c:=5]
更改的信号。
解决方案:
只需将此块添加到代码中希望重新缓存DT
的当前值的任何位置。它不会消耗任何内存或时间(因为除了引用之外,DT <- DT
不会复制任何其他内容),但它确实会有效地向knitr发送一个(假的)信号,表明DT
已经更新:
```{r, cache=TRUE, echo=FALSE}
DT <- DT
示例文档的工作版本:
通过运行您的文档的以下编辑版本来检查它是否正常工作:
```{r}
库(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-04-08 09:20:09
正如Josh O‘’Brien在答案下面的第四条评论中指出的那样,我已经添加了一个新的块选项cache.vars
来处理这种非常特殊的情况。在第二个缓存块中,我们可以指定cache.vars='DT'
,以便knitr
保存DT
的副本。
```{r}
库(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
无论您编译文档多少次,输出都是这样的:
https://stackoverflow.com/questions/15298359
复制相似问题