Czy R ma instrukcję assert jak w Pythonie?

98

instrukcja, która sprawdza, czy coś jest prawdą, a jeśli nie, wyświetla podany komunikat o błędzie i kończy działanie

Dan
źródło

Odpowiedzi:

123

stopifnot()

Możesz być także zainteresowany pakietami takimi jak Runit i testami do testów jednostkowych.

Harlan
źródło
Czy istnieje sposób kontrolowania komunikatu o błędzie, który jest zgłaszany po zatrzymaniu funkcji stopifnot ()?
Nick
13
@Nick, nie. Używaj stopifnot()do testowania poprawności, aby sprawdzić, czy kod robi to, co powinien, ale if (blahdiblah) stop("error message")do testowania danych wejściowych, aby sprawdzić, czy dane wejściowe do programu są prawidłowe. Tylko to ostatnie powinno się zdarzyć podczas normalnego użytkowania.
Harlan,
6
Zobacz także nowy assertthatpakiet Hadley , który daje lepsze odpowiedzi niż stopifnotte: github.com/hadley/assertthat
Harlan
12

@Nacięcie:

Możesz kontrolować swój komunikat o błędzie, jeśli napiszesz funkcję z opisową nazwą, aby przetestować warunek, który spowoduje błąd w programie. Oto przykład:

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

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

Spowoduje to wydrukowanie liczb od 1 do 8, a następnie wydrukowanie komunikatu

Error: Less_Than_8(i) is not TRUE

Byłoby miło, gdyby „i” w nawiasach zostało zastąpione wartością, która nie przeszła testu, ale dostajesz to, za co płacisz.

Jeśli potrzebujesz czegoś bardziej wyszukanego, zajrzyj do Runita i przetestuj, jak zasugerował Harlan.

CCC
źródło
Możesz po prostu umieścić definicję funkcji stopifnot()również wewnątrz .
naught101
2
naught101, celem przeprowadzenia testu w nazwanej funkcji jest uzyskanie nazwy testu wydrukowanej w komunikacie o błędzie
Matthew
5

Można to osiągnąć za pomocą stoppolecenia. To polecenie zatrzyma wykonywanie funkcji i wyświetli komunikat o błędzie. Na przykład możemy sprawdzić, czy zmienna somethingto FALSE:

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

Podobnie warningpolecenie wyświetli ostrzeżenie (ale będzie kontynuować wykonywanie kodu).

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

Oba są dostarczane przez podstawową R i nie wymagają żadnych pakietów do uruchamiania lub dołączania do pisania własnych funkcji. Wolę takie podejście do pisania kodu z mniejszą liczbą zależności, a ta składnia jest szeroko stosowana w tworzeniu pakietów. Jednak podobną funkcjonalność obsługuje pakiet „assertthat” z assert_thatfunkcją, która została niedawno wydana jako część pakietu „tidyverse” Hadleya.

Tom Kelly
źródło