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

bwk*_*bwk 11 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}
Run Code Online (Sandbox Code Playgroud)

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

我使用的是knitr 1.13和Rstudio 0.99.896.

编辑:如果我改为Sweave,上面的代码将正确输出(并打破),这使我认为这是一个knitr问题.

CL.*_*CL. 6

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

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

  • 在PDF输出的情况下,在发生错误之后经常编译输出PDF失败,但仍然存在中间TEX文件.打开此文件可能会显示错误消息.
  • 正如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}
Run Code Online (Sandbox Code Playgroud)

进度窗口显示:

进度窗口

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