【发布时间】:2013-02-22 09:43:20
【问题描述】:
似乎knitr 不理解DT[, a:=1] 不应导致向文档输出DT。有没有办法阻止这种行为?
示例knitr文档:
Data.Table Markdown
========================================================
Suppose we make a `data.table` in **R Markdown**
```{r}
DT = data.table(a = rnorm(10))
```
Notice that it doesn't display the contents until we do a
```{r}
DT
```
style command. However, if we want to use `:=` to create another column
```{r}
DT[, c:=5]
```
It would appear that the absence of a equals sign tricks `knitr` into thinking this
is to be printed.
针织输出:
这是knitr 错误还是data.table 错误?
编辑
我刚刚注意到,knitr 在echo 处理代码时很奇怪。看看上面的输出。在我的源代码中,我有 DT[, c:=5] 但 knitr 呈现的是
DT[, `:=`(c, 5)]
奇怪...
编辑 2:缓存
:= 的缓存似乎也有问题,但这肯定是不同的原因,所以这里有一个单独的问题:why does knitr caching fail for data.table `:=`?
【问题讨论】:
-
我很难理解这是一个
data.table错误。如果将其分配回 DT 会发生什么? (虽然我不确定 MatthewDowle 是否愿意)。 -
好主意!
DT=DT[, :=]是一个可行的解决方法。我怀疑它一定是knitr,但我不知道knitr是如何决定它是否应该输出的——这纯粹是分配的存在吗?data.table显然做了一些事情来停止控制台中的输出 - 也许这还不够全面? -
如果将表达式包装在 invisible() 中,则 knitr 不会打印它,这让我认为 knitr 比在有作业时不打印更聪明。但后来我认为 data.table 在这种情况下可能应该返回一个不可见的对象,因此 data.table 中的错误可能是可能的。为什么还是打印不出来?那一定是 data.table 的事……
-
@Spacedman,对于
:=(通过引用分配),是的,它没有。您必须使用print(DT[, LHS := RHS])或DT[, LHS := RHS][]。 -
如果我从 R-forge 获得最新的 data.table 并使用 devtools 加载它,我确实会看到带有
DT[,c:=1]的打印输出。但只有在加载了 devtools 时。这个包确实有一些看起来很粗鲁的东西,到处都是invisible()和一个.global对象。嗯。
标签: r data.table knitr