2014-05-03 142 views
3

如何從knitr獲得更好的錯誤報告?錯誤信息從knitr獲得跟蹤

例如現在knitr與退出:

Calls: knit ... lapply -> FUN -> lapply -> FUN -> rename -> <Anonymous> 

當我運行相同的代碼交互R 2與退出:

Calls: getSampleData ... lapply -> FUN -> lapply -> FUN -> rename -> <Anonymous> 

這是更理解這個問題更好 - 至少我知道哪些功能被扔的錯誤。

理想情況下,我還想追加traceback()的等價物。

+0

聽起來像一個功能請求。我認爲Yihui確實注意到了SO,但我也認爲有可能有更好的方法將它置於眼前。 –

回答

2

您可以設置opts_chunk$set(error = FALSE),那麼當發生錯誤時您將能夠運行traceback()。但是,這需要您運行knitrin an interactive R session

1

對於相關的問題,您實際上想向文檔的讀者顯示錯誤,我編寫了一個包裝函數,用於計算並保存針織文檔中的回溯,並替換顯示它的traceback()。這裏是代碼:

saveTraceback <- local({ 
    savedTraceback <- NULL 
    saver <- function(e) { 
    calls <- sys.calls() 
    deparsed <- lapply(calls, deparse) 
    deparsed <- deparsed[-length(deparsed)+0:1] # leave off last 2 
    lastjunk <- max(grep("withCallingHandlers", deparsed)) 
    deparsed <- deparsed[-seq_len(lastjunk)] 
    savedTraceback <<- deparsed 
    } 
    function(expr) 
    withCallingHandlers(expr, error = saver) 
}) 

traceback <- function() { 
    base::traceback(environment(saveTraceback)$savedTraceback) 
} 

你會這樣使用它。不執行呢?首先顯示代碼:

<<mycode,eval=FALSE>>= 
f <- function() stop("this is an error") 
g <- function() f() 
g() 
@ 

然後在saveTraceback()函數執行它,而不顯示:

<<echo=FALSE>>= 
saveTraceback({ 
<<mycode>> 
}) 
@ 

最後調用traceback(),這將顯示一些像什麼 用戶將在看到控制檯。