R a-t-il une instruction assert comme en python?

98

une instruction qui vérifie si quelque chose est vrai et sinon imprime un message d'erreur donné et quitte

Dan
la source

Réponses:

123

stopifnot()

Vous pouvez également être intéressé par paquets comme Runit et testthat pour les tests unitaires.

Harlan
la source
Existe-t-il un moyen de contrôler le message d'erreur qui est signalé si stopifnot () s'arrête?
Nick
13
@Nick, non. Utilisez stopifnot()pour le test de validité, pour tester que le code fait ce qu'il est censé faire, mais if (blahdiblah) stop("error message")pour le test d'entrée, pour tester que l'entrée du programme est valide. Seul ce dernier devrait se produire lors d'une utilisation normale.
Harlan
6
Voir aussi le nouveau assertthatpackage de Hadley , qui donne de meilleures réponses que stopifnot: github.com/hadley/assertthat
Harlan
12

@Pseudo:

Vous pouvez contrôler votre message d'erreur si vous écrivez une fonction avec un nom descriptif pour tester la condition qui générera une erreur dans votre programme. Voici un exemple:

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

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

Cela imprimera les chiffres 1 à 8, puis imprimera un message indiquant

Error: Less_Than_8(i) is not TRUE

Ce serait bien si le "i" entre parenthèses était remplacé par la valeur qui a échoué au test, mais vous en avez pour votre argent.

Si vous avez besoin de quelque chose de plus sophistiqué que cela, regardez dans Runit et testez-le comme Harlan l'a suggéré.

CCC
la source
Vous pouvez simplement mettre la définition de la fonction à l'intérieur stopifnot()aussi.
rien101
2
rien101, le point d'avoir le test dans une fonction nommée est d'obtenir le nom du test imprimé dans le message d'erreur
Matthieu
5

Ceci peut être réalisé avec la stopcommande. Cette commande interrompt l'exécution d'une fonction et affiche le message d'erreur. Par exemple, nous pouvons tester si la variable somethingest FALSE:

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

De même, la warningcommande affichera un avertissement (mais continuera à exécuter le code).

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

Ceux-ci sont tous deux fournis par la base R et ne nécessitent aucun package à exécuter ou à inclure dans l'écriture de vos propres fonctions. Je préfère cette approche pour écrire du code avec moins de dépendances et cette syntaxe est largement utilisée dans le développement de packages. Cependant, une fonctionnalité similaire est prise en charge par le package "assertthat" avec la assert_thatfonction qui a récemment été publiée dans le cadre du "tidyverse" de Hadley.

Tom Kelly
la source