2015-11-05 198 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的答案轉換爲完整的解決方案 –