2011-03-07 16 views
5

Supongamos que tengo dos archivos R: correct.R y broken.R. ¿Cuál sería la mejor forma de usar tryCatch para verificar si hay errores?Uso de tryCatch y fuente

Actualmente, tengo

> 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 

Sin embargo, la forma en que he construido el tryCatch significa que tengo para interrogar a los x y y objetos para determinar si se ha producido un error.

¿Hay una mejor manera de hacerlo?


La pregunta viene de la enseñanza. 100 estudiantes cargan sus scripts R y yo ejecuto los scripts. Para ser amable, estoy planeando crear una función simple que determine si las fuentes de sus funciones son correctas. Solo necesita devolver VERDADERO o FALSO.

+0

Tenga en cuenta que 'tryCatch' solo informará el primer error que encuentre. – aL3xa

Respuesta

2

Tal vez estoy underthinking esto, pero ya que estamos sólo en busca de la booleano, sólo se puede comprobar la existencia de la $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 

¿Eso resolver lo que está buscando? Se podría envolverlo en un bucle (o utilizar lapply) como:

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

Eso es lo que estoy haciendo, parecía torpe. Supongo que estaba buscando un comando 'is.error'. – csgillespie

+3

use inherits (x, "try-error") – mdsumner

+0

er, con objetos de try que es, no tryCatch – mdsumner

4

Prueba esto:

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

Alternativamente, usted debe considerar testthat paquete de Hadley:

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

Para ampliar punto de mdsumner, esta es una implementación simple.

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