r - 在 R 或 Rstudio 中记录带有错误的控制台历史记录

标签 r rstudio

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

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

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

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

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

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

最佳答案

一个可能的解决方案是使用 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") 

关于r - 在 R 或 Rstudio 中记录带有错误的控制台历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33556266/

相关文章:

r - 如何获取数据框中每个组的平均值

r - 当中断不唯一时将列中的值分配给十分位数

r - R Studio 中的内存限制

R studio 切换选项卡的快捷方式 :ctrl+alt+left/right not working

r - 批量执行R脚本

r - ggplot 中虚拟变量的分位数回归误差

r - 如何使用R版本2.12.1在Ubuntu 9.10上安装R软件包rgl?

R Shiny : Use Onclick Option of Actionbutton on the Server Side

r - Beamer 演示 RStudio 更改 block 的字体大小

r - Windows R 的 Kerberos 身份验证