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 depthknitr
。但先尝试将触发器更改为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]
```