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

如果此条件不成立,您将收到信息性(ish)错误,例如

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 回答