Можно ли использовать функции RUnit check *, чтобы делать предварительные условия/постусловия или делать это с некоторой пеной в производительности или другими?
Как сделать утверждения в R?
Ответ 1
Я знаю, что это старый пост, но, возможно, этот ответ будет полезен другим, которые ищут утверждения 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
Он полностью непроверен, поэтому используйте свою собственную опасность!
Ответ 2
Я всегда использую stopifnot()
для утверждений.