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
.或者任何更好的解决方案都是最受欢迎的.