174 votes

Equivalent de "throw" en R

Comment "lancer" une erreur en R ? J'ai une fonction qui prend un cadre de données et quelques noms de colonnes et fait quelque chose avec. Si les colonnes n'existent pas, je veux que la fonction s'arrête et que toutes les fonctions qui en dépendent s'arrêtent.

J'ai regardé recover y browse y traceback mais, bon, ils semblaient être proches mais pas ce que je cherche.

2 votes

À droite, recover, browser et traceback sont destinés au débogage, tandis que les systèmes try/catch sont destinés à la gestion des erreurs dans le code de production.

22 votes

J'adore quand les personnes qui posent des questions utilisent le nom de la fonction qu'elles recherchent plusieurs fois dans une question ;)

0 votes

Je pense qu'il y a une raison pour laquelle cette question a plus de votes positifs que la première réponse. Même si cette autre question est techniquement hors sujet, il s'agit de ce genre de résumé très serré d'un sujet peu familier qui fait la renommée de Stack Overflow.

142voto

Dirk Eddelbuettel Points 134700

Voir help(tryCatch) :

Les conditions sont signalées par ' signalCondition '. En outre, le
' stop et warning Les fonctions ont ont été modifiées pour accepter également
arguments de condition.

et plus tard sous "Voir aussi" :

' stop et warning les conditions du signal, et ' try est essentiellement un version simplifiée de ' tryCatch '.

donc vous voulez probablement stop .

33 votes

Cela fonctionne parfaitement. R est si bizarre, sans que ce soit de sa faute - il a été conçu bien avant que nous ayons mis au point une bonne conception des langages interprétés.

7 votes

Selon les auteurs, il a été fortement influencé par Scheme, qui est à la fois vieux et bon. R est " lispy " mais avec des structures de données funky. Les parties "intéressantes" de R sont probablement liées au fait que beaucoup de conventions diffèrent d'autres langages, notamment de la famille des langages C dont il est syntaxiquement proche. Je suppose que c'est parce que le langage a été développé par un groupe de statisticiens qui avaient besoin d'un bon outil, plutôt que par des développeurs qui avaient besoin d'un bon outil. Le fait que le "point" soit juste un caractère a mis du temps à être compris.

8 votes

Quelques exemples de base ici seraient bien, pas seulement avoir des citations. Ici stackoverflow.com/a/23917007/54964

63voto

Un exemple simple :

f <- function(a, b){ 

    if (a == 0){ 
            stop("error message")
    }
 }

8voto

Shane Points 40885

Au-delà des fonctions de base que Dirk mentionne :

El Paquet R.oo possède une fonctionnalité supplémentaire de gestion des exceptions, notamment une fonction throw() très utile. Vous pouvez attraper les exceptions avec les fonctions habituelles try ou trycatch :

> try(throw("Division by zero.")); print("It's ok!");
Error: [2009-10-22 10:24:07] Exception: Division by zero.
[1] "It's ok!"

Vous pouvez en savoir plus à ce sujet ici : http://www1.maths.lth.se/help/R/R.oo/

8 votes

Hehe. R n'est pas assez funky sans OO ? Désolé d'être flip, et merci beaucoup pour cette réponse intéressante, mais je vais me contenter du bon vieux stop() ci-dessus.

2 votes

Il y a encore plus d'OO maintenant. :)

3 votes

@ws. Qu'est-ce qui est si funky avec R ? plot trace une fonction, try stop warn Tout fonctionne comme prévu, et presque tout ce que je veux faire se fait en une seule ligne.

7voto

Chris Points 365

En fait, la fonction stopifnot est très pratique pour mettre en place des contrôles d'intégrité dans votre code. Il prend en compte plusieurs expressions logiques et renvoie une erreur si l'une d'entre elles est évaluée à faux.

Exemple : Pour vérifier si la colonne 'c' existe dans le dataframe 'df' :

df <- data.frame(a = numeric(), b = numeric())
stopifnot(!is.null(df$c))

Cela entraînera l'erreur suivante :

Error: !is.null(df$c) is not TRUE

0 votes

Si vous souhaitez modifier le message d'erreur par rapport à celui produit par défaut par l'option stopifnot vous pouvez l'envelopper avec tryCatch comme dans : tryCatch(error = function(cnd) "your message here", stopifnot(your_condition)

1voto

xm1 Points 387

Vous pouvez vérifier si la colonne existe et faire ce que vous voulez.
Supposons qu'un data.frame nommé df1 et vérifier si la colonne col1 existe :

if(! any(grepl('^col1$',colnames(df1)))) stop("nonexistent column")

ou

if(! any(grepl('^col1$',colnames(df1)))) return(-1)

Par exemple

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X