编译PDF时自定义错误消息

时间:2014-08-25 19:25:22

标签: r pdf error-handling knitr sweave

鉴于以下R knitr文件:

\documentclass{article}
\begin{document}

<<data>>=
opts_chunk$set(comment = NA)  # omits "##" at beginning of error message
x <- data.frame(x1 = 1:10)
y <- data.frame()
@ 

<<output_x>>=
if (nrow(x) == 0) stop("x is an empty data frame.") else summary(x)
@

<<output_y>>=
if (nrow(y) == 0) stop("y is an empty data frame.") else summary(y)
@

\end{document}

正如预期的那样,最后一个块会返回自定义消息的错误。编译后的PDF看起来有点不同:

Error: y is an empty data frame.

我希望这个文字只是

y is an empty data frame.

没有Error:部分或红色。我能做到吗?怎么样?

编辑:我可以通过以下解决方法在模拟数据中创建它:

<<output_y>>=
if (nrow(y) == 0) cat("y is an empty data frame.") else summary(y)
@

但是,这不适用于我的实际数据,因为我需要在此时停止该功能。

2 个答案:

答案 0 :(得分:1)

虽然我不明白为什么不应该调用错误Error,但您可以自由地自定义输出挂钩error以从消息中删除Error:

library(knitr)
knit_hooks$set(error = function(x, options) {
  knitr:::escape_latex(sub('^Error: ', '', x))
})

答案 1 :(得分:0)

你可以这样做。 options("show.error.messages" = FALSE)会关闭错误消息,因此您可以在输入if语句后暂时使用该消息,并使用on.exit重置该消息。

这样,stop停止了该功能,避免了Error:,并且所需的信息以红色打印。

> f <- function(x) {
      if(x > 5) {
          g <- getOption("show.error.messages")
          options(show.error.messages = FALSE)
          on.exit(options(show.error.messages = g))
          message("x is greater than 5.")
          stop()
      }
      x
  }
> f(2)
# [1] 2
> f(7)
# x is greater than 5.

注意:我不确定这是多么安全,而且我不是改变功能内options设置的大支持者。