从knitr调用来自fread的奇怪输出

bap*_*ste 14 r knitr data.table

我正在使用最近推出的fread函数data.table来读取数据文件.当我将代码包装到knitr(Rmd)文档中时,我注意到一些奇怪的输出,即:

## 
0%
Run Code Online (Sandbox Code Playgroud)

即使verbose选项fread设置为FALSE.我曾经sink隐藏过这个输出,但是我想向包作者报告确切的问题.这是一个最小的例子,

library(knitr)

test = "```{r}
require(data.table) 
fread('1 2 3\n')
```"
knit2html(text=test, output="test.html")
browseURL("test.html")
Run Code Online (Sandbox Code Playgroud)

什么是0%的输出?

Mat*_*wle 15

这是一个%进度计数器.对我来说,它打印0%,5%,10%,... 95%,100%(例如),\r最后使其显示在fread提示输入时的调用下面的一行上.

但是当从函数,批处理和编织器调用时,这是不可取的.这已被删除.来自NEWS for v1.8.9(rev 851):

  • %进度控制台计量表已被删除.在批处理模式,日志文件和无法处理的报告中,输出很不方便\r.通过在C for循环中保存代码(这就是为什么它不是可选的)fread,很难检测到调用的位置,加上,删除它会加快fread一点.使用操作系统的系统监视器确认fread正在进行中.感谢Baptiste突出显示:
    来自knitr的fread的奇怪输出

只是快速提醒完整性.从顶部?fread:

此功能仍在开发中.例如,日期被读作字符(之后可以使用优秀的快速时间包或标准基本函数进行转换)和嵌入式引号("\""和"""")有问题.还有其他已知问题没有已经修复并且功能尚未实现.但是,您可能会发现它在许多情况下都有效.请向datatable-help或Stack Overflow的data.table标记报告问题.

还没有用于生产.并不是因为它在崩溃或有缺陷的意义上是不稳定的(你的测试会证明它是否在你的情况下是稳定的)但是因为fread的论点和行为在将来可能会改变; 也就是说,我们期望做出(希望是次要的)非向后兼容的变化.为什么它已经发布到CRAN呢?因为CRAN维护人员要求维护版本遵守R-devel中新的更严格的测试,并且一些Bioconductor软件包依赖于data.table和Bioconductor要求软件包通过R-devel检查.让fread进入并写下这些段落更快,而不是畏缩.

  • `fread`非常好(但真的应该赞美SO?),老实说我不知道​​这些东西来自哪里(它没有在knitr之外显示)所以我当然不是故意让任何人都不高兴情怀.我只是想知道原因是什么,直接联系相关包的作者. (9认同)
  • 您的回答中是否必须如此苛刻?我理解对你写的东西的批评,但我不知道那些抨击这个可怜的家伙有帮助.当有人去了我的一个开源项目时,我做到了这一点,但事实并非如此. (9认同)
  • @baptiste - 感谢您添加评论.我认为这真的只是一个很大的误解,并期望马修可能会在他回来时编辑答案.与此同时,我鼓励人们停止低估答案,让自己冷静下来.我们都受益于拥有Matthew和baptiste,我希望他们都能在这里受到充分的欢迎. (8认同)
  • 为了记录,我并没有低估这个答案,而是接受它.我也有开源项目,花了无数个小时帮助别人,我们都知道它是什么样的. (5认同)
  • @baptiste道歉,这太苛刻了.我反应的是"令人不快的噪音". (4认同)

mne*_*nel 12

报告不是问题.

正如Matthew Dowle所说,这是一个进步的反击 fread

您可以设置results = 'hide'以避免包含这些结果

library(knitr)

test = "```{r, results = 'hide'}
require(data.table) 
fread('1 2 3\n')
```"
knit2html(text=test, output="test.html")
browseURL("test.html")
Run Code Online (Sandbox Code Playgroud)

看,没有进度条.


在实际层面上,我认为拥有results = 'hide'甚至是include = FALSE这样的一步是明智的.

你不会希望重复这样的步骤阅读,实际上,你永远只需要读取一次数据,然后你会序列化(使用save,saveRDS或类似的),所以你可以用它下一次(这将是更快).


根据评论进行编辑

我会将处理分成几个较小的块.然后,您可以不在块中包含读取,但包括未评估的虚拟版本(因此您可以查看代码,但不包括结果)

```{r libraries}
require(data.table) 
 ```

```{r loaddata, include = FALSE}
DT <- fread('yourfile')
```

```{r loaddummy, ref.label = 'loaddata', eval = FALSE, echo = TRUE}
```

```{r dostuff}
# doing other stuff
```
Run Code Online (Sandbox Code Playgroud)

  • @baptiste - 不用担心.它每1e5行更新一次.(看看`fread.c`,也许是`if(i%10000 == 0 && clock()> nexttime)``if(verbose && i%10000 == 0 && clock()> nexttime)` - 您可能没有看到它的原因是您在运行`fread`时没有坐下来观看控制台(之后它会消失) (2认同)