Как сделать утверждения в R? - PullRequest
10 голосов
/ 04 февраля 2011

Рекомендуется ли использовать функции RUnit check * для создания предусловий / постусловий или же это может привести к некоторому снижению производительности или к другому?

Ответы [ 2 ]

21 голосов
/ 04 февраля 2011

Я всегда использую stopifnot() для утверждений.

4 голосов
/ 28 августа 2012

Я знаю, что это старый пост, но, возможно, этот ответ будет полезен для других, ищущих 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 и хотите убедиться, что для каждого элемента от одного до десяти, вы можете использовать

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

Она полностью не проверена, поэтому используйте на свой страх и риск!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...