Hat R eine Assert-Anweisung wie in Python?

97

Eine Anweisung, die prüft, ob etwas wahr ist, und wenn nicht, eine bestimmte Fehlermeldung ausgibt und beendet

Dan
quelle

Antworten:

123

stopifnot()

Möglicherweise interessieren Sie sich auch für Pakete wie Runit und testthat für Unit-Tests.

Harlan
quelle
Gibt es eine Möglichkeit, die Fehlermeldung zu steuern, die gemeldet wird, wenn stopifnot () stoppt?
Nick
12
@ Nick, nein. Verwenden Sie diese stopifnot()Option zum Testen der Gültigkeit, um zu testen, ob der Code das tut, was er tun soll, aber if (blahdiblah) stop("error message")zum Testen der Eingabe, um zu testen, ob die Eingabe in das Programm gültig ist. Nur letzteres sollte jemals während des normalen Gebrauchs passieren.
Harlan
6
Siehe auch Hadleys neues assertthatPaket, das bessere Antworten gibt als stopifnot: github.com/hadley/assertthat
Harlan
12

@ Nick:

Sie können Ihre Fehlermeldung steuern, wenn Sie eine Funktion mit einem beschreibenden Namen schreiben, um die Bedingung zu testen, die einen Fehler in Ihrem Programm auslöst. Hier ist ein Beispiel:

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

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

Dadurch werden die Nummern 1 bis 8 gedruckt und anschließend eine Nachricht mit der Aufschrift gedruckt

Error: Less_Than_8(i) is not TRUE

Es wäre schön, wenn das "i" in Klammern durch den Wert ersetzt würde, der den Test nicht bestanden hat, aber Sie bekommen, wofür Sie bezahlen.

Wenn Sie etwas ausgefalleneres brauchen, schauen Sie sich Runit an und testen Sie, wie Harlan es vorgeschlagen hat.

CCC
quelle
Sie können auch einfach die Funktionsdefinition einfügen stopifnot().
naught101
2
naught101, der Punkt, um den Test in einer benannten Funktion zu haben, besteht darin, den Namen des Tests in der Fehlermeldung zu drucken
Matthew
4

Dies kann mit dem stopBefehl erreicht werden. Dieser Befehl stoppt die Ausführung einer Funktion und gibt die Fehlermeldung aus. Zum Beispiel können wir testen, ob die Variable somethingist FALSE:

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

In ähnlicher Weise gibt der warningBefehl eine Warnung aus (führt den Code jedoch weiter aus).

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

Diese werden beide von Base R bereitgestellt und erfordern keine Pakete zum Ausführen oder Schreiben Ihrer eigenen Funktionen. Ich bevorzuge diesen Ansatz, um Code mit weniger Abhängigkeiten zu schreiben, und diese Syntax wird häufig in der Paketentwicklung verwendet. Eine ähnliche Funktionalität wird jedoch vom "assertthat" -Paket mit der assert_thatFunktion unterstützt, die kürzlich als Teil von Hadleys "tidyverse" veröffentlicht wurde.

Tom Kelly
quelle