似乎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 `:=`?

最佳答案

更新2014年10月。现在在data.table v1.9.5中:



和相关:





为后代保留以前的答案(由于从data.table v1.9.5开始不再处理global$depthtrigger业务,因此不再适用)...

为了清楚起见,我明白了:knitr在您不希望的时候打印。

尝试在脚本开始时稍微增加data.table:::.global$depthtrigger

目前,这将是3个:

data.table:::.global$depthtrigger
[1] 3

我不知道评估深度knitr添加了多少堆栈。但是先尝试将触发器更改为4。即
assign("depthtrigger", 4, data.table:::.global)

然后在knitr脚本的末尾确保将其设置回3。如果4不起作用,请尝试5,然后尝试6。如果达到10,则放弃,我会再考虑。 ;-P

为什么会起作用?

请参阅v1.8.4的新闻:



该全局标志是data.table:::.global$print。在data.table:::print.data.table的顶部,您会看到它。这是因为没有已知的方法可以抑制从[打印(如FAQ 2.22所述)。

因此,在:=内部的[.data.table内部,它看起来看起来像是该调用的“深度”:
if (Cstack_info()[["eval_depth"]] <= .global$depthtrigger) {
    suppPrint = function(x) { .global$print=FALSE; x }
    # Suppress print when returns ok not on error, bug #2376.
    # Thanks to: https://stackoverflow.com/a/13606880/403310
    # All appropriate returns following this point are
    # wrapped i.e. return(suppPrint(x)).
}

基本意思就是说:如果DT[,x:=y]在提示符下运行,那么我知道REPL将对我的结果调用print方法,这超出了我的控制范围。好的,既然print方法即将运行,我将通过设置一个标志在print方法中隐藏它(因为运行的print方法(即print.data.table)是我可以控制的)。

knitr的情况下,它以一种巧妙的方式模拟REPL。它实际上不是一个脚本iiuc,否则出于这个原因DT[,x:=y]仍然无法打印。但是因为它是通过eval模拟REPL的,所以对于从eval运行的代码,还有一个额外的knitr深度级别。或类似的东西(我不知道knitr)。

这就是为什么我在考虑增加depthtrigger可能会解决问题的原因。

哈克/鲁cr,我同意。但是,如果有效,并且让我知道哪个值有效,则可以将data.table更改为knitr感知,并自动更改depthtrigger。或任何更好的解决方案是最欢迎的。

关于r - knitr被data.table `:=`分配欺骗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15267018/

10-12 19:41