11

RUnitの check* 関数を使用して前提条件/事後条件ステートメントを作成することをお勧めしますか、それともパフォーマンスなどに何らかのペナルティが伴いますか?

4

2 に答える 2

23

私はいつもstopifnot()アサーションに使用します。

于 2011-02-04T13:25:52.717 に答える
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

この条件が真でない場合、次のような有益な (っぽい) エラーが発生します。

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

完全にテストされていないため、自己責任で使用してください。

于 2012-08-28T05:29:00.217 に答える