使用knitr时如何打印到控制台?

时间:2016-09-01 21:00:34

标签: r rstudio knitr

我正在尝试打印到控制台(或输出窗口)以进行调试。例如:

\documentclass{article}

\begin{document}

<<foo>>=
print(getwd())
message(getwd())
message("ERROR:")
cat(getwd(), file=stderr())
not_a_command() # Does not throw an error?
stop("Why doesn't this throw an error?")
@


\end{document}

我在输出PDF中得到了结果,但我的问题是我有一个未完成的脚本(所以没有输出PDF来检查),我试图理解为什么。如果编织没有成功完成,似乎也没有日志文件输出。

我正在使用knitr 1.13和Rstudio 0.99.896。

编辑:如果我更改为Sweave,上面的代码将正确输出(和中断),这样我就会认为这是一个编织问题。

1 个答案:

答案 0 :(得分:6)

这个问题有几个方面 - 部分是XY problem。核心问题是(正如我所读到的):

  

如果knitr失败并且不生成输出文件,我怎么能看到错误?

  • 在PDF输出的情况下,经常在发生错误后编译输出PDF失败,但仍然存在中间TEX文件。打开此文件可能会显示错误消息。
  • As suggested by Gregor,您可以在控制台(或块)中逐行运行块中的代码。但是,这可能无法重现所有问题,特别是如果它们与工作目录或环境相关。
  • capture.output可用于将调试信息打印到外部文件。
  • 最后(与我之前的评论相反), 可以在RStudio的进度窗口上打印(或者它被调用):来自挂钩的消息将打印在进度窗口。基本上,消息必须来自knitr本身,而不是来自代码knitr评估。
  

如何在RStudio中的进度窗口上打印调试信息?

以下示例使用debug = TRUE

打印每个块后的环境中的所有对象
\documentclass{article}

\begin{document}

<<>>=
knitr::knit_hooks$set(debug = function(before, options, envir) {
  if (!before) {
    message(
      paste(names(envir), as.list(envir),
            sep = " = ", collapse = "\n"))
  }
})
@

<<debug = TRUE>>=
a <- 5
foo <- "bar"
@

\end{document}

进度窗口显示:

Progress window

当然,对于具有更多或更大对象的文档,应调整钩子以选择性地打印(部分)对象。