knitr似乎不理解DT[, a:=1]不应该导致文档的输出为DT.有没有办法阻止这种行为?

Example knitr document:

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输出:

在此处输入图像描述

这是knitr个错误还是data.table个错误?

EDIT

我只是刚刚注意到,knitr在编码时是很奇怪的.看看上面的输出.在我的源代码中,我有DT[, c:=5]个渲染,但knitr个渲染是多少

DT[, `:=`(c, 5)]

奇怪的

EDIT 2: Caching

缓存似乎也有:=的问题,但这一定是另一个原因,所以这里有一个单独的问题:why does knitr caching fail for data.table `:=`?

推荐答案

Update Oct 2014.现在是数据.表v1.9.5 :

:=不再在knitr中打印,以与提示#505时的行为保持一致.测试knit("knitr.Rmd")的输出现在是数据.表的单元测试.

和相关的:

if (TRUE) DT[,LHS:=RHS]现在不打印(多亏了Jureis,#869).增加了测试.为了实现这一点,我们不得不面对一个缺点:如果在函数结束前没有DT[]的函数中使用:=,那么下次在提示下键入DT时,将不会打印任何内容.将打印一个重复的DT.为了避免这种情况:在函数的最后:=后面加上DT[].如果这是不可能的(例如,这不是一个可以更改的功能),则保证在提示下打印print(DT)DT[].和以前一样,建议在:=查询的末尾添加一个额外的[]来更新并打印;e、 g.> DT[,foo:=3L][]



之前的答案留给后人(global$depthtrigger业务不再是从data.table v1.9.5中完成的,所以这不再是真的)...

我明白了:knitr是在你不想打印的时候打印的.

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

这将是你目前的3个:

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

我不知道eval depth knitr会给堆栈增加多少.但首先try 将触发器更改为4;即

assign("depthtrigger", 4, data.table:::.global)

knitr脚本结束时,确保将其设置回3.如果4不起作用,试试5,然后6.如果你到10岁就放弃,我会再考虑的-P

为什么会这样?

见v1新闻.8.4 :

DT[,LHS:=RHS,...] no longer prints DT. This implements #2128 "Try again to get DT[i,j:=value] to return invisibly". Thanks to discussions here :
how to suppress output when using `:=` in R {data.table}, prior to v1.8.3?
http://r.789695.n4.nabble.com/Avoiding-print-when-using-tp4643076.html
FAQs 2.21 and 2.22 have been updated.

FAQ 2.21 Why does DT[i,col:=value] return the whole of DT? I expected either no visible value (consistent with <-), or a message or return value containing how many rows were updated. It isn't obvious that the data has indeed been updated by reference.
这在v1中发生了变化.8.3

FAQ 2.22 Ok, thanks. What was so difficult about the result of DT[i,col:=value] being returned invisibly?
R内力

全球国旗是data.table:::.global$print.在data.table:::print.data.table的顶部,你会看到它在看它.这是因为没有已知的方法来 suppress [的打印(如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.data.table)是我可以控制的)在print方法中 suppress 它.

knitr的例子中,它以一种巧妙的方式模拟REPL.这不是一个真正的脚本,iiuc,否则DT[,x:=y]不会因为这个原因打印出来.但因为它通过eval模拟REPL,所以从knitr开始运行的代码有一个额外的eval深度.或者类似的(我不知道knitr).

这就是为什么我认为增加depthtrigger可能会奏效.

我同意.但如果它有效,并且您让我知道哪个值有效,我可以将data.table更改为knitr,并自动更改depthtrigger.或者任何更好的解决方案都是最受欢迎的.

R相关问答推荐

ggplot 2中的地块底图(basemaps_gglayer()不起作用)

R Tidymodels textercipes-使用spacyR进行标记化-如何从生成的标记列表中删除标点符号

查找图下的面积

在使用ggroove后,将图例合并在gplot中

如何根据组大小应用条件过滤?

如何在格子中添加双曲曲线

删除列表中存储的数据帧内和数据帧之间的重复行

使用across,starts_with和ifelse语句变更多个变量

如何对2个列表元素的所有组合进行操作?

根据现有列的名称和字符串的存在进行变异以创建多个新列

R中边际效应包中Logistic回归的交互作用风险比

以NA为通配符的R中的FULL_JOIN以匹配其他数据中的任何值.Frame

跨列查找多个时间报告

在多页PDF中以特定布局排列的绘图列表不起作用

随机森林的带Shap值的蜂群图

从R中发出的咕噜声中的BUG?

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

如何在条形图中的x和填充变量中包含多个响应变量?

Broom.Mixed::Augment不适用于Sample::分析

识别部分重复行,其中一行为NA,其重复行为非NA