knitr 的三项新调试功能

注释

这是最近几篇关于新功能的帖子之一四天编织分诊冲刺;关于冲刺的完整细节,请参见那篇文章。

当一份文件无法完成编织时,最糟糕的不是错误本身——而是寻宝游戏。也就是行,在即块状,制作就是这样信息?在一份包含数十个段落的长报告中,这个狩猎可能花费的时间比实际修复还长。

本周期的三个新增内容都针对同一目标:更快地告诉你问题的来源。

点击错误,跳转到行

当一个块出错时,编织者打印一条“退出行......”带有文件和行范围的消息。在支持超链接的终端——比如RStudio IDE——中,这条路径现在是一个可点击的链接,直接带你到有问题的行:

Quitting from report.Rmd:42-45  ← now clickable in RStudio

不需要配置;如果你的前端设置了合适的环境变量(RStudio 设置了)RSTUDIO_CLI_HYPERLINKS),你会得到链接,其他地方则是原来的普通路径。

这是个小问题,但每次遇到错误都会从循环中移除一步(#2153).

是用于警告的回溯,而不仅仅是错误

错误长期以来能够显示RLANG回溯——导致失败的电话链。警告无法找到,这很遗憾,因为隐藏在一份大文件(“通过胁迫引入的”匿名戒毒“)中的警告,和错误一样难以定位。某处)和错误一样难以定位。

现在警告也可以带回溯。默认关闭;开启时有选项:

options(rlang_backtrace_on_warning_report = "full")   # or "branch"

有了这个集合,编织时发出的每个警告后面都会跟着发出它的调用树,这样你就能准确看到是哪个函数引发了它(#2219).

看你的代码运行

有时候问题根本不是错误——而是渲染悬挂或者耗时很久,你根本不知道是哪块导致的。这对远程服务器或批处理作业渲染的文档尤其痛苦,因为你不能直接观看交互式会话。

新的log.echo块选项将每个表达式流向stderr评估前立即:

```{r, log.echo=TRUE}
step_one()
step_two()   # if the render hangs here, you'll see step_two() logged and then silence
```

因为日志记录是在评估前进行的,你看到的最后一行记录就是当前运行的那行。如果你的日志平台戳了时间戳,你还能免费获得一个粗略分析器——下一个日志行之前的间隔就是该表达式花了多长时间(#2222).

三个不同的问题——错误、警告、卡壳——现在还有三种方法来确定每个问题的来源。

参与讨论