2011-02-04 10 views

Respuesta

4

Sé que esta es una publicación anterior, pero quizás esta respuesta sea útil para otros que busquen afirmaciones R en forma de operador. Esto podría ser un paso en la dirección correcta si desea virar una afirmación al final de una declaración problemática.

"%assert%" <- function(e1, e2) 
{ 

    args <- as.list(match.call()[-1]) 
    defs <- as.list(args$e1) 
    preds <- as.list(args$e2)[-1L] 

    for(var in names(defs)[names(defs) != ""]) assign(var, eval(defs[[var]])) 

    for(p in unlist(preds)) eval(
     parse(
      text = paste0("if(!", deparse(p), ") stop('assertion ",deparse(p) , " is not true')") 
     ) 
    ) 

    return(eval(args$e1)) 

} 

Ejemplo: si está calculando la media de un vector x y quiere asegurarse de que cada elemento es de entre uno y diez podría utilizar

mean(x = sample(1:10, size = 100, replace = T)) %assert% c(min(x) > 0 && max(x) < 11) 
#5.62 

Si esta condición ISN' t que verdadera, obtendrá una (o menos) de error informativo, como

mean(x = sample(11:20, size = 100, replace = T)) %assert% c(min(x) > 0, max(x) < 11) 
#Error in eval(expr, envir, enclos) : assertion max(x) < 11 is not true 

es completamente probado, a fin de utilizar a su propio riesgo!

20

Siempre uso stopifnot() para las aserciones.

+6

Secundado. Es fácil, está claro, está en R Base y con eso es omnipresente. –

+2

pero sufre legibilidad. Quiero explicar por qué falló la precondición y verificar * es simplemente hermoso _checkEquals (a, b, "a debe ser b") _ –

+0

Alternativamente, usar 'if' +' stop' permite verificar una condición y dar un mensaje de error. – nico

Cuestiones relacionadas