Чи має R твердження про твердження, як у python?


97

заява, яка перевіряє, чи щось відповідає дійсності, а якщо ні, друкує задане повідомлення про помилку та виходить

Відповіді:


123

stopifnot()

Вас також можуть зацікавити такі пакети, як Runit і testt для модульного тестування.


Чи є спосіб контролювати повідомлення про помилку, яке повідомляється, якщо stopifnot () зупиняється?
Нік

12
@ Нік, ні. Використовуйте stopifnot()для тестування на валідність, для тестування того, що код робить те, що він повинен робити, але if (blahdiblah) stop("error message")для вхідного тестування, щоб перевірити, чи є вхід в програму дійсним. Тільки останні повинні колись траплятися під час звичайного використання.
Харлан

6
Дивіться також новий assertthatпакет Хадлі , який дає кращі відповіді, ніж stopifnotце: github.com/hadley/assertthat
Харлан

12

@Nick:

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

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 і перевірте, як запропонував Гарлан.


Ви можете просто помістити визначення функції всередину stopifnot().
naught101

2
naught101, сенс тесту в іменованій функції полягає в тому, щоб назву тесту було надруковано у повідомленні про помилку
Матвій

4

Цього можна досягти за допомогою stopкоманди. Ця команда зупинить виконання функції та надрукує повідомлення про помилку. Наприклад, ми можемо перевірити , якщо змінна somethingє FALSE:

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

Аналогічно warningкоманда надрукує попередження (але продовжуйте виконувати код).

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

Обидва вони надаються базовою R і не вимагають жодних пакунків для запуску або включення в письмовій формі власних функцій. Я віддаю перевагу такому підходу для написання коду з меншою кількістю залежностей, і цей синтаксис широко використовується в розробці пакунків. Однак аналогічну функціональність підтримує пакет "assrtthat" з assert_thatфункцією, яка нещодавно була випущена як частина "Tidyverse" Хедлі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.