使用tryCatch和source

时间:2011-03-07 11:11:14

标签: r error-handling try-catch

假设我有两个R文件:correct.Rbroken.R。使用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。

3 个答案:

答案 0 :(得分:4)

试试这个:

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

或者,您应该考虑Hadley的testthat包:

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

答案 1 :(得分:4)

要扩展mdsumner的观点,这是一个简单的实现。

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

答案 2 :(得分:2)

也许我没有解决这个问题,但是因为你只是在寻找布尔值,你可以只测试$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)
}