【问题标题】:How can I print to the console when using knitr?使用 knitr 时如何打印到控制台?
【发布时间】:2016-09-01 21:00:33
【问题描述】:

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

\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,上面的代码将正确输出(并中断),所以这让我认为这是一个 knitr 问题。

【问题讨论】:

  • 这是一个有用的解决方法,感谢@CL。 !
  • 您仍然可以一次运行一段代码或一次运行一行代码。由于您使用的是 RStudio,因此有用于运行当前块、下一个块、所有块的热键(代码 > 运行区域)。

标签: r rstudio knitr


【解决方案1】:

这个问题有几个方面 - 部分是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}

进度窗口显示:

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

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多