记录R或Rstudio中存在错误的控制台历史记录

时间:2015-11-05 22:47:51

标签: r rstudio

出于教育目的,我们记录了学生在实验室中输入rstudio控制台的所有命令。此外,我们希望存储如果呼叫成功或引发错误,以识别那些努力使语法正确的学生。

我能想到的最好的是:

options(error = function(){
  timestamp("USER ERROR", quiet = TRUE)
})

当发生异常时,会在历史记录日志中添加## ERROR注释。因此,我们可以分析历史文件,以查看## ERROR评论后面跟着哪些命令。

然而,R的内部历史记录系统不适合记录,因为它是内存中的,有限的大小,需要使用savehistory()手动存储。此外,我更希望存储每个呼叫一行的日志,即多行命令的转义换行符。

是否有挂钩或在R或RStudio控制台中记录实际执行的命令?这样我就可以在数据库中插入每个评估的表达式(和错误)以及用户名和时间戳。

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是使用addTaskCallbacktaskCallbackManager和一个将每个顶级命令写入数据库的函数。回调只会在命令的成功完成时触发,因此您仍然需要在错误上调用日志记录功能。

# 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")