似乎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/