knitr被数据欺骗。表“:=”赋值

knitr被数据欺骗。表“:=”赋值,r,data.table,knitr,R,Data.table,Knitr,似乎knitr不理解DT[,a:=1]不应导致向文档输出DT。有没有办法阻止这种行为 示例knitr文档: Knitr输出: 这是knitrbug还是data.tablebug 编辑 我刚刚注意到,knitr在echoing代码的时候很奇怪。看看上面的输出。在我的源代码中,我有DT[,c:=5]但是knitr呈现的是 DT[, `:=`(c, 5)] 奇怪的 编辑2:缓存 缓存似乎也与:=有关,但这一定是另一个原因,所以这里有一个单独的问题:更新2014年10月。现在在data.table

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

示例
knitr
文档: Knitr输出:

这是
knitr
bug还是
data.table
bug

编辑

我刚刚注意到,
knitr
echo
ing代码的时候很奇怪。看看上面的输出。在我的源代码中,我有
DT[,c:=5]
但是
knitr
呈现的是

DT[, `:=`(c, 5)]
奇怪的

编辑2:缓存


缓存似乎也与
:=
有关,但这一定是另一个原因,所以这里有一个单独的问题:

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

:=
不再在
knitr
中打印,以与提示时的行为保持一致。测试
knit(“knitr.Rmd”)
的输出现在位于data.table的单元测试中

和相关的:

如果(TRUE)DT[,LHS:=RHS]
现在不打印(多亏了Jureiss,)。添加了测试。为了使这一点起作用,我们不得不面对一个不利因素:如果在函数结束之前在没有
DT[]
的函数中使用
:=
,那么下次在提示下键入
DT
时,将不会打印任何内容。将打印重复的
DT
。要避免这种情况:在函数中的最后一个
:=
后面包含一个
DT[]
。如果这是不可能的(例如,这不是一个可以更改的功能),则保证打印提示处的
print(DT)
DT[]
。与之前一样,建议在
:=
查询的末尾添加一个额外的
[]
,然后进行更新和打印;e、 g.
>DT[,foo:=3L][]



先前的答案留给后人(不再从数据中执行
global$depthtrigger
业务。表v1.9.5因此这不再是真的)

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

尝试在脚本开始时稍微增加
数据。表::.global$depthtrigger

这将是你目前的3个:

data.table:::.global$depthtrigger
[1] 3
我不知道在堆栈中添加了多少eval depth
knitr
。但先尝试将触发器更改为4;i、 e

assign("depthtrigger", 4, data.table:::.global)
knitr
脚本的末尾,确保将其设置回3。如果4不起作用,试试5,然后6。如果你到10岁就放弃,我会再考虑的-P

为什么会这样

请参阅v1.8.4中的新闻:

DT[,LHS:=RHS,…]
不再打印
DT
。这实现了#2128“Try 再次获取
DT[i,j:=value]
以不可见方式返回”。感谢这里的讨论:


常见问题解答2.21和2.22已更新


常见问题解答2.21为什么DT[i,col:=value]返回整个DT?我希望没有可见的值(与一致),我遇到了相同的问题,我通过重新分配变量很容易地解决了它。在您的情况下:

DT <- DT[, ':=' (c, 5)]
DT为什么不直接使用:

```{r, results='hide'}
DT[, c:=5]
```

只需在表达式周围加上invisible()。这对我很有用。

对于2017年带着RMarkdown 1.3和data返回此表达式的人来说。表1.10或类似内容,有一个


这随后在RMarkdown 1.4中得到了修复,我发现很难理解这是一个
data.table
bug。如果将它分配回DT会发生什么情况?(虽然我不确定MatthewDowle是否会喜欢)。好主意!
DT=DT[,:=]
是一个可行的解决方法。我怀疑它一定是
knitr
,但我不知道
knitr
如何决定是否应该输出-这纯粹是因为存在赋值吗?
数据。table
显然做了一些事情来停止控制台中的输出-也许这不够全面?如果将表达式包装在inv中isible()然后knitr不打印它,这让我觉得knitr比在有任务的情况下不打印更聪明。但是我认为data.table在这种情况下可能会返回一个不可见的对象,因此data.table中可能会出现错误。为什么不打印它呢?那必须是data.table的业务…@Spacedman,例如
:=
(通过引用分配),是的,它没有。您必须使用
打印(DT[,LHS:=RHS])
DT[,LHS:=RHS][
。如果我从R-forge获得最新的data.table并使用devtools加载它,我确实会看到打印输出的
DT[,c:=1]
。但仅当加载devtools时。包中确实有一些看起来粗糙的
不可见()
到处都是
.global
object.Hmmm.aargh!我刚刚花了半个小时从源代码中挖掘出来!为什么对C堆栈深度进行测试是一个很好的测试,以确定是否隐藏结果?@Spacedman它本身可能不太好。但这是到目前为止我发现的唯一一种知道该cal是否返回结果的方法l to
[.data.table
即将由REPL打印。
invisible()
的内部也设置了一个全局标志,顺便说一句。基本上,R忽略了
[.class
的结果的不可见性,并以任何方式打印它(FAQ 2.22)。因为在开发
data.table
时(我基本上只是将source().R代码转换为.GlobalEnv)我需要
depthtrigger
为9。但是当安装包时,
depthtrigger
可以是更低的3。我假设这与包含
ByteCompile:TRUE
@Spacedman的描述有关。有时你必须打破一些鸡蛋来制作一个omlette,即使有一些外壳落入其中。v1中引入了更新.9.5,似乎不再适用于v1.9.6(或今天的1.9.7)。knitr仍在打印data.table after:=赋值。因为它可能不是块中的唯一内容。随着解决方案的进行,自赋值可能会
DT <- DT[, ':=' (c, 5)]
```{r, results='hide'}
DT[, c:=5]
```