2011-03-07 112 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")) 
}