我正在编写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
}
答案 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
}
```