Использование tryCatch и исходного кода - PullRequest
7 голосов
/ 07 марта 2011

Предположим, у меня есть два файла R: correct.R и broken.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, означает, что мне нужно опросить объекты x и y, чтобы определить, есть либыла ошибка.

Есть ли лучший способ сделать это?


Вопрос исходит от обучения.100 учеников загружают свои R-скрипты, и я запускаю их.Чтобы быть милым, я планирую создать простую функцию, которая определяет, правильно ли работают их источники.Требуется только вернуть TRUE или FALSE.

Ответы [ 3 ]

4 голосов
/ 07 марта 2011

Попробуйте это:

> 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
4 голосов
/ 07 марта 2011

Чтобы расширить точку зрения mdsumner, это простая реализация.

sources_correctly <- function(file)
{
  fn <- try(source(file))
  !inherits((fn, "try-error"))
}
2 голосов
/ 07 марта 2011

Может быть, я недооцениваю это, но так как вы просто ищете логическое значение, вы можете просто проверить наличие $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)
}
...