在knitr输出中显示语法错误?

时间:2015-04-20 13:32:13

标签: knitr

我正在编写R语法的描述,并且我想要包含一些包含语法错误的语句,例如

if (n >= 2) 
{
    # if TRUE
}
else
{
    # if FALSE
}

(这是顶级语法错误,因为在if被读取之前else已完成。)我试图将其放入knitr文档,但是 即使使用error=TRUE它也会失败,因为该选项只会影响运行时错误,而不会影响语法错误。是否有一些合理的方法来显示如果我在控制台输入它将显示什么?即 我喜欢它显示像

这样的东西
if (n >= 2) 
{
    # if TRUE
}
else
Error: unexpected 'else' in "else"
{
    # if FALSE
}

2 个答案:

答案 0 :(得分:0)

这里有一个功能,可以完成我想要的一部分:它会从语法错误中重现输出,但它不会执行knitr所做的所有标记,因此格式错误。

parse_with_error <- function(text) {
  reportError <- function(e) {
    msg <- conditionMessage(e)
    line <- as.numeric(sub("^text:([[:digit:]]*):.*", "\\1", msg))
    col <- as.numeric(sub("^text:[[:digit:]]*:([[:digit:]]*):.*", "\\1", msg))
    cat(text[1:line], sep="\n")
    if (col > 1)
      cat(paste(rep(" ", col-1), collapse=""))
    cat("^\n")
    err <- sub("^text:[[:digit:]]*:[[:digit:]]*: ([^[:cntrl:]]*)\n.*", "\\1", msg)
    parseData <- getParseData(sf)
    lastToken <- parseData[nrow(parseData), "text"]
    cat(paste0("Error: ", err, ' in "', lastToken, '"'), "\n")
  }
  text <- unlist(strsplit(text, "\n"))
  sf <- srcfile("text")
  tryCatch(parse(text = text, keep.source = TRUE, srcfile=sf), 
        error = reportError)

}

这显示了如何使用它:

parse_with_error(
"if (TRUE) {
  # do TRUE
}
else {
  # do FALSE
}")

答案 1 :(得分:0)

您可以使用单独的R会话来评估代码,例如

```{r, engine='Rscript', error=TRUE}
if (TRUE) 
{
    # if TRUE
}
else
{
    # if FALSE
}
```