2011-03-07 118 views
5

假設我有兩個R文件:correct.Rbroken.R。使用tryCatch檢查錯誤的最佳方法是什麼?使用tryCatch和源

目前,我有

> x = tryCatch(source("broken.R"), error=function(e) e) 
> x 
<simpleError in source("broken.R"): test.R:2:0: unexpected end of input 
    1: x = { 
    ^> 
> y = tryCatch(source("correct.R"), error=function(e) e) 
> y 
$value 
[1] 5 

$visible 
[1] FALSE 

不過,我已經構建了tryCatch的方式意味着我必須詢問xy對象,以確定是否出現了錯誤。

有沒有更好的方法來做到這一點?


問題來自教學。 100名學生上傳他們的R腳本並運行腳本。爲了不錯,我打算創建一個簡單的函數來確定函數是否正確。它只需要返回TRUE或FALSE。

+0

請注意'tryCatch'只會報告碰到的第一個錯誤。 – aL3xa 2011-03-07 21:32:10

回答

2

也許我underthinking這一點,但因爲你只是在尋找布爾,你可以測試的$visible的存在:

y <- tryCatch(source("broken.R"), error=function(e) e) 
works <- !is.null(y$visible) #y$visible would be null if there were an error 

這是否解決你在找什麼?你可以在一個循環中把它包裝(或使用lapply),如:

for(i in 1:length(students)) { 
    works[i] <- !is.null(tryCatch(source(student_submissions[i]), error=function(e) e)$visible) 
} 
+0

這就是我正在做的,它看起來很笨重。我想我正在尋找一個'is.error'命令。 – csgillespie 2011-03-07 12:00:03

+3

使用繼承(x,「嘗試錯誤」) – mdsumner 2011-03-07 12:16:34

+0

呃,嘗試的對象,而不是tryCatch – mdsumner 2011-03-07 12:27:56

4

試試這個:

> tryCatch(stop("foo"), error = function(e) { 
+ cat(e$message, "\n") 
+ FALSE 
+ }) 
foo 
[1] FALSE 

或者,你應該考慮哈德利的testthat包:

> expect_that(stop("foo"), is_a("numeric")) 
Error in is.vector(X) : foo 
2

要在擴大mdsumner的觀點,這是一個簡單的實現。

sources_correctly <- function(file) 
{ 
    fn <- try(source(file)) 
    !inherits((fn, "try-error")) 
}