3

我使用的代码计算语法错误并在程序运行后报告语法错误的数量。错误计数代码是在 stackoverflow 上提供的,以响应我之前的问题:R:是否有一个用于说明是否发生任何错误的文件末尾的命令?

有时我在分析大型数据集时忘记注释打印消息,而 R 无法打印所有数据和所有代码。

 [ reached getOption("max.print") -- omitted 498 rows ] 

当发生这种情况并且错误计数代码报告错误时,我不能简单地向上滚动以查看错误是什么。有没有办法在 R 代码运行后定位错误?我尝试使用traceback()但没有帮助。我从未使用过traceback(),也许我没有正确使用它。我在网上找到的其他潜在解决方案似乎需要在运行 R 文件之前插入代码。

我可以用注释掉的 print 命令重新运行 R 代码,但在这种情况下,代码需要几个小时才能运行。也许我可以使用较小的数据集快速重新运行代码以找到错误,但这假设数据集的大小不会以某种方式导致错误。

这是一个包含错误的示例程序。如果n更改为一个大数字,可能是 10000000,此代码似乎会创建相同的场景或类似于我上面描述的场景。谢谢你的任何建议。

我通常通过将代码保存在 *.r 文件中来运行我的代码,然后复制该文件的内容并将其粘贴到安装 R 应用程序期间放置在我的戴尔 PC 64 位 Windows 7 Professional 桌面上的默认 R GUI 中。

# the four lines below are for counting syntax errors

.error.count <- 0
old.error.fun <- getOption("error")
new.error.fun <- quote(.error.count <- .error.count + 1)
options(error = new.error.fun, width=2400)

##########################################################

n <- 10

a <- rnorm(n,10,4)
b <- rnorm(n,50,8)
c <- EXP(b)
d <- a + b

df <- data.frame(a,b,d)
df

##########################################################

# the three lines below count the number of errors in the code above

cat("ERROR COUNT:", .error.count, "\n")
options(error = old.error.fun)
rm(.error.count, old.error.fun, new.error.fun)

##########################################################

traceback()

# No traceback available
4

2 回答 2

1

这是一个仅在交互模式下有效的选项,AFAICT。

修改您的序言以将错误消息写入错误日志变量:

.error.log <- NULL
old.error.fun <- getOption("error")

new.error.fun <- quote({
  .error.count <- .error.count + 1
  .error.log <- c(.error.log, geterrmessage())
})

然后运行您的代码和cat()错误日志的值:

cat("ERROR COUNT:", .error.count, "\n")
cat("ERROR LOG:", .error.log, collapse="\n")

结果:

> cat("ERROR COUNT:", .error.count, "\n")
ERROR COUNT: 1 
> cat("ERROR LOG:", .error.log, collapse="\n")
ERROR LOG: Error: could not find function "EXP"
于 2013-01-08T15:04:36.227 回答
1

这是一种稍微不同的方法,它使用该local函数创建一个包含日志的错误记录器。

error.logger <- local({
    error.log <- list() # initial empty log
    function () {
        # each time called, add to the log
        error.log <<- c(error.log, geterrmessage()) 
    }
})

options(error=error.logger, show.error.locations=TRUE)

这与 Andrie 的方法基本相同,但避免了全局变量.error.log。您可以使用 访问日志get('error.log', environment(error.logger))show.error.locations=TRUE将在您的错误消息中包含源代码行号。

无论您处于交互模式还是批处理模式,这都有效。

于 2013-01-08T15:58:06.883 回答