2011-02-04 20 views
10

Czy zaleca się używanie funkcji sprawdzania * RUnit w celu wykonania warunków wstępnych/oświadczeń o stanie końcowym, czy też mają one pewną karalność w działaniu lub inne?Jak tworzyć asercje w R?

Odpowiedz

4

Wiem, że to stary post, ale być może ta odpowiedź będzie przydatna dla osób szukających asercji R w formie operatora. Może to być krok we właściwym kierunku, jeśli chcesz umieścić twierdzenie na końcu kłopotliwego stwierdzenia.

"%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)) 

} 

Przykład: jeśli obliczenie średniej wektora X i chcesz się upewnić, że każdy element jest od jednego do dziesięciu można użyć

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

Jeśli ten warunek ISN” t prawda, dostaniesz informacyjny (ish) błąd taki jak

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 

To całkowicie niesprawdzone, więc używać na własne ryzyko!

20

Zawsze używam stopifnot() dla asercji.

+6

Oddelegowany. To proste, jasne, jest w bazie R, a przy tym jest wszechobecne. –

+2

ale cierpi na czytelność. Chcę wyjaśnić, dlaczego warunek wstępny nie powiódł się, a check * jest po prostu piękny _checkEquals (a, b, "a must be b") _ –

+0

Alternatywnie użycie 'if' +' stop' pozwala sprawdzić warunek i dać komunikat o błędzie. – nico

Powiązane problemy