在R或Rstudio中记录错误的控制台历史记录
为了教育目的,我们正在记录学生在实验室期间在rstudio控制台中键入的所有命令。此外,如果通话成功或出现错误,我们希望存储以识别努力使语法正确的学生。在R或Rstudio中记录错误的控制台历史记录
我能想出的最好的是这样的:
options(error = function(){
timestamp("USER ERROR", quiet = TRUE)
})
这在历史日志发生异常时增加了一个## ERROR
评论。因此,我们可以分析历史文件以查看哪些命令后面跟着## ERROR
评论。
但是R的内部历史记录系统不适合记录,因为它是内存中的,有限的大小,需要手动存储在savehistory()
。另外,我还希望将每日一行的记录存储为日志,即多行命令的换行换行符。
在R或RStudio控制台中是否可能存在挂钩或用于记录实际执行的命令?这将允许我将每个评估的表达式(和错误)与用户名和时间戳一起插入到数据库中。
一个可能的解决方案是使用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
@Jeroen作为'R'和'RStudio'的新人,我可以请求你在这里发布你的完整解决方案吗?它会帮助我很多;不幸的是,我甚至不知道还有什么需要将Joshua的答案转换为完整的解决方案 –
你只关心*命令吗? –
@JoshuaUlrich是只有用户输入的命令。 – Jeroen