2014 年 10 月更新。现在在 data.table v1.9.5 中:
:=
不再打印knitr
为了与提示时的行为保持一致,#505 https://github.com/Rdatatable/data.table/issues/505。测试输出knit("knitr.Rmd")
现在处于 data.table 的单元测试中。
和相关:
if (TRUE) DT[,LHS:=RHS]
现在不打印(感谢 Jureiss,#869 https://github.com/Rdatatable/data.table/issues/869)。已添加测试。为了让它发挥作用,我们不得不忍受一个缺点:如果:=
在函数内部使用,没有DT[]
在函数结束之前,然后在下一次DT
在提示符下输入,不会打印任何内容。重复的一个DT
将打印。为了避免这种情况:包括一个DT[]
最后一次之后:=
在你的函数中。如果这是不可能的(例如,它不是您可以更改的功能),那么print(DT)
and DT[]
在提示符下保证打印。和以前一样,添加一个额外的[]
在 a 的末尾:=
查询是建议更新然后打印的习惯用法;例如> DT[,foo:=3L][]
以前的答案为后代保留(global$depthtrigger
从 data.table v1.9.5 开始,业务不再完成,所以这不再是事实)...
只是为了清楚我的理解:knitr
当您不希望打印时正在打印。
尝试增加data.table:::.global$depthtrigger
脚本开头的一点点。
目前您的数量为 3:
data.table:::.global$depthtrigger
[1] 3
我不知道评估深度是多少knitr
添加到堆栈中。但先尝试将触发器更改为4; IE。
assign("depthtrigger", 4, data.table:::.global)
并在结束时knitr
脚本确保将其设置回 3。如果 4 不起作用,请尝试 5,然后尝试 6。如果达到 10,请放弃,我会再考虑一下。 ;-P
为什么这可能有效?
请参阅 v1.8.4 的新闻:
DT[,LHS:=RHS,...]
不再打印DT
。这实现了#2128“尝试
再次得到DT[i,j:=value]
无形地返回”。感谢这里的讨论:
在 v1.8.3 之前,如何在 R {data.table} 中使用 `:=` 时抑制输出? https://stackoverflow.com/questions/11359553/how-to-suppress-output-when-using-in-r-data-table
http://r.789695.n4.nabble.com/Avoiding-print-when-using-tp4643076.html http://r.789695.n4.nabble.com/Avoiding-print-when-using-tp4643076.html
常见问题解答 2.21 和 2.22 已更新。
FAQ 2.21 为什么DT[i,col:=value]返回整个DT?我期望没有可见的值(与
这在 v1.8.3 中发生了变化
以满足您的期望。请升级。返回整个 DT
(现在不可见)以便复合语法可以工作;例如。,
DT[i,完成:=TRUE][,总和(完成)]。返回更新的行数
当详细程度打开时,无论是基于每个查询还是全局使用
选项(datatable.verbose=TRUE)。
常见问题解答 2.22 好的,谢谢。 DT[i,col:=value] 隐形返回结果有什么难的?
R 内力
[ 的可见性。 FunTab 的 eval 列的值(请参阅
src/main/names.c) for [ 为 0 表示强制 R_Visible 打开(请参阅
R-内部结构第 1.6 节)。因此,当我们尝试看不见()或
自己直接将R_Visible设置为0,在src/main/eval.c中进行eval
会再次强制它打开。要解决这个问题,关键是要停止
尝试在 := 之后停止运行 print 方法。相反,在 := 里面
我们现在(从 v1.8.3 开始)设置一个全局标志, print 方法使用它来
知道是否实际打印。
该全球标志是data.table:::.global$print
。在顶端data.table:::print.data.table
你看着它就会看到它。那是因为没有已知的方法来抑制打印[
(如常见问题解答 2.22 所解释)。
所以,里面:=
inside [.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
)是我可以控制的)。
In knitr
在这个例子中,它以一种巧妙的方式模拟 REPL。这不是一个真正的脚本,iiuc,否则DT[,x:=y]
由于这个原因无论如何都不会打印。但因为它是通过一个模拟 REPLeval
还有一个额外的级别eval
代码运行深度knitr
。或者类似的东西(我不知道knitr
).
这就是为什么我正在考虑增加depthtrigger
可能会成功。
哈克/粗俗,我同意。但如果它有效,并且你让我知道哪个值有效,我可以改变data.table
to be knitr
意识到并改变depthtrigger
自动地。或者任何更好的解决方案都是最受欢迎的。