2011-02-04 6 views

答えて

4

これは古い投稿であることは知っていますが、おそらくこの回答はオペレータフォームのRアサーションを探している他の人にとって役に立ちます。面倒なステートメントの最後にアサーションを付ける場合、これは正しい方向への一歩かもしれません。

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

} 

例:あなたはベクトルxの平均値を計算していて、各要素が1と10の間にあることを確認したい場合は、

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

を使用することができ場合、この条件のISN」トン真の、あなたはそれが完全にテストされていないですので、ご自身の責任で使用して、このような

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 

として情報提供(ISH)エラーが発生します!

20

アサーションには常にstopifnot()を使用します。

+6

Seconded。それは簡単です、それは明らかです、それはRベースにあり、それは遍在しています。 –

+2

ですが、読みやすくなります。前提条件がうまくいかなかった理由を説明したいと思います。*チェックは単に美しい_checkEquals(a、b、 "a must be b")_ –

+0

代わりに 'if' +' stop'を使って条件をチェックしてエラーメッセージを出すことができます。 – nico

関連する問題