【发布时间】:2013-02-24 06:07:19
【问题描述】:
这在精神上与this问题有关,但在机制上必须不同。
如果您尝试缓存包含data.table := 分配的knitr 块,那么它就好像该块尚未运行,并且以后的块看不到:= 的影响。
知道这是为什么吗? 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.
第二次运行的输出
【问题讨论】:
-
+1 恐怕我对此一无所知。当您说“第二次以后”时,您的意思是重复
DT,在cache=FALSE块内重复DT,还是重新运行脚本? “第二次运行时输出”之后没有任何内容 - 即它是完全空白的,或者你忘记在那里粘贴一些东西。尝试在各个点使用.Internal(inspect(DT))检查对象。knitr缓存是如何实现的? -
@MatthewDowle -- 这有点投机(b/c 我不想深入研究 knitr 的缓存机制)但我怀疑我下面的答案至少得到了大局正确。
-
@JoshO'Brien Cool,听起来对我来说是正确的,谢谢。打算回到它并更改
knitr或data.table以一起玩得很好,但同时这个解决方案很好。 -
@MatthewDowle -- 在我看来,将其固定在 knitr 方面会更好,而 Yihui 似乎也同意这一点。顺便说一句,非常感谢您进行了使 data.table 在 R-3.0.0 下工作所需的更改!摆脱所有非 API 调用需要做很多工作吗?
-
@JoshO'Brien 没问题。不是真的,就几个小时。 Brian Ripley 让我知道 Cstack_info() 的存在帮了我很多忙。如果没有那个提示,我会被困很长时间。
标签: r caching data.table knitr