出于教育目的,我们记录了学生在实验室中输入rstudio控制台的所有命令。此外,我们希望存储如果呼叫成功或引发错误,以识别那些努力使语法正确的学生。
我能想到的最好的是:
options(error = function(){
timestamp("USER ERROR", quiet = TRUE)
})
当发生异常时,会在历史记录日志中添加## ERROR
注释。因此,我们可以分析历史文件,以查看## ERROR
评论后面跟着哪些命令。
然而,R的内部历史记录系统不适合记录,因为它是内存中的,有限的大小,需要使用savehistory()
手动存储。此外,我更希望存储每个呼叫一行的日志,即多行命令的转义换行符。
是否有挂钩或在R或RStudio控制台中记录实际执行的命令?这样我就可以在数据库中插入每个评估的表达式(和错误)以及用户名和时间戳。
答案 0 :(得分:1)
一种可能的解决方案是使用addTaskCallback
或taskCallbackManager
和一个将每个顶级命令写入数据库的函数。回调只会在命令的成功完成时触发,因此您仍然需要在错误上调用日志记录功能。
# error handler
logErr <- function() {
# turn logging callback off while we process errors separately
tcbm$suspend(TRUE)
# turn them back on when we're done
on.exit(tcbm$suspend(FALSE))
sc <- sys.calls()
sclen <- length(sc) # last call is this function call
if(sclen > 1L) {
cat("myError:\n", do.call(paste, c(lapply(sc[-sclen], deparse), sep="\n")), "\n")
} else {
# syntax error, so no call stack
# show the last line entered
# (this won't be helpful if it's a parse error in a function)
file1 <- tempfile("Rrawhist")
savehistory(file1)
rawhist <- readLines(file1)
unlink(file1)
cat("myError:\n", rawhist[length(rawhist)], "\n")
}
}
options(error=logErr)
# top-level callback handler
log <- function(expr, value, ok, visible) {
cat(deparse(expr), "\n")
TRUE
}
tcbm <- taskCallbackManager()
tcbm$add(log, name = "log")
这不是一个完整的解决方案,但我希望它足以让你开始。以下是输出结果的示例。
> f <- function() stop("error")
f <- function() stop("error")
> hi
Error: object 'hi' not found
myError:
hi
> f()
Error in f() : error
myError:
f()
stop("error")