2015-11-05 115 views
2

为了教育目的,我们正在记录学生在实验室期间在rstudio控制台中键入的所有命令。此外,如果通话成功或出现错误,我们希望存储以识别努力使语法正确的学生。在R或Rstudio中记录错误的控制台历史记录

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

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

这在历史日志发生异常时增加了一个## ERROR评论。因此,我们可以分析历史文件以查看哪些命令后面跟着## ERROR评论。

但是R的内部历史记录系统不适合记录,因为它是内存中的,有限的大小,需要手动存储在savehistory()。另外,我还希望将每日一行的记录存储为日志,即多行命令的换行换行符。

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

+0

你只关心顶级命令吗? –

+0

@JoshuaUlrich是只有用户输入的命令。 – Jeroen

回答

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") 
+1

谢谢,我不知道'taskCallbackManager',非常有趣! – Jeroen

+0

@Jeroen作为'R'和'RStudio'的新人,我可以请求你在这里发布你的完整解决方案吗?它会帮助我很多;不幸的是,我甚至不知道还有什么需要将Joshua的答案转换为完整的解决方案 –