我使用代码来计算语法错误,并在程序运行后报告语法错误的数量。错误计数代码是在stackoverflow上提供的,以响应我之前的问题:R: is there a command for the end of a file that states whether any errors occurred?
有时我忘记在分析大数据集时注释掉打印消息,而R无法打印所有数据和所有代码。
[ reached getOption("max.print") -- omitted 498 rows ]
当发生这种情况并且错误计数代码报告错误时,我不能简单地向上滚动以查看错误是什么。 R代码运行后有没有办法找到错误?我尝试使用traceback()
,但没有帮助。我从未使用traceback()
,也许我没有正确使用它。我在网上找到的其他潜在解决方案似乎需要在运行R文件之前插入代码。
我可以用注释掉的print命令重新运行R代码,但在这种情况下代码需要几个小时才能运行。也许我可以用较小的数据集快速重新运行代码来查找错误,但是假设数据集的大小不会以某种方式导致错误。
这是一个包含错误的示例程序。如果将n
更改为大数,可能是10000000,则此代码似乎会创建相同的方案或类似于我上面描述的方案。谢谢你的任何建议。
我通常通过将代码保存在* .r文件中来运行我的代码,然后复制该文件的内容并将其粘贴到安装R期间放置在Dell 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
答案 0 :(得分: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"
答案 1 :(得分: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
会在错误消息中包含源代码行。
无论您处于交互模式还是批处理模式,这都有效。