【问题标题】:Logging console history with errors in R or Rstudio在 R 或 Rstudio 中记录带有错误的控制台历史记录
【发布时间】:2015-11-05 22:47:50
【问题描述】:

出于教育目的,我们会记录学生在实验期间在 rstudio 控制台中键入的所有命令。此外,我们希望存储调用是否成功或引发错误,以识别那些努力获得正确语法的学生。

我能想到的最好的方法是这样的:

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

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

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

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

【问题讨论】:

  • 你只关心顶级命令吗?
  • @JoshuaUlrich 是的,只有用户输入的命令。

标签: r rstudio


【解决方案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") 

【讨论】:

  • 谢谢,我不知道taskCallbackManager,很有趣!
  • @Jeroen 作为R 和RStudio 的新手,我可以要求您在此处发布完整的解决方案吗?这对我有很大帮助;不幸的是,我什至不知道将 Joshua 的答案转换为完整的解决方案还需要什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2013-01-17
  • 1970-01-01
  • 2015-05-11
相关资源
最近更新 更多