Есть ли в R утверждение assert, как в python?

98

оператор, который проверяет, верно ли что-то, а если нет, печатает сообщение об ошибке и завершает работу

Дэн
источник

Ответы:

123

stopifnot()

Вам также могут быть интересны такие пакеты, как Runit и testthat для модульного тестирования.

Харлан
источник
Есть ли способ контролировать сообщение об ошибке, которое появляется, если stopifnot () останавливается?
Ник
13
@ Ник, нет. Используйте stopifnot()для проверки достоверности, чтобы проверить, что код выполняет то, что он должен делать, но if (blahdiblah) stop("error message")для тестирования ввода, чтобы проверить правильность ввода в программу. Только последнее должно происходить при нормальном использовании.
Harlan
6
См. Также новый assertthatпакет Хэдли , который дает лучшие ответы, чем stopifnotдает: github.com/hadley/assertthat
Харлан
12

@Ник:

Вы можете управлять своим сообщением об ошибке, если напишете функцию с описательным именем, чтобы проверить условие, которое вызовет ошибку в вашей программе. Вот пример:

Less_Than_8 = function(x) return(x < 8)

for (i in 1:10)
{
  print(i)
  stopifnot(Less_Than_8(i))
}

Это напечатает числа от 1 до 8, а затем напечатает сообщение, в котором говорится

Error: Less_Than_8(i) is not TRUE

Было бы неплохо, если бы букву «i» в круглых скобках заменили значением, которое не прошло проверку, но вы получите то, за что платите.

Если вам нужно что-то более интересное, загляните в Runit и проверьте это, как предложил Харлан.

CCC
источник
Вы также можете просто поместить определение функции внутрь stopifnot().
naught101
2
naught101, смысл наличия теста в именованной функции состоит в том, чтобы имя теста было напечатано в сообщении об ошибке
Мэтью
5

Это можно сделать с помощью stopкоманды. Эта команда остановит выполнение функции и напечатает сообщение об ошибке. Например, мы можем проверить , если переменная somethingявляется FALSE:

if(something == FALSE){
   stop("error message to print")   
}

Аналогичным образом warningкоманда выведет предупреждение (но продолжит выполнение кода).

if(something == FALSE){
   warning("error message to print")   
}

Оба они предоставляются базовым R и не требуют пакетов для запуска или включения в написании ваших собственных функций. Я предпочитаю этот подход для написания кода с меньшим количеством зависимостей, и этот синтаксис широко используется при разработке пакетов. Однако аналогичная функциональность поддерживается пакетом assertthat с assert_thatфункцией, которая недавно была выпущена как часть «tidyverse» Хэдли.

Том Келли
источник