web-dev-qa-db-fra.com

Équivalent de "jeter" dans R

Comment on "jette" une erreur dans R? J'ai une fonction qui prend un cadre de données et des noms de colonnes et les remplit. Si les colonnes n'existent pas, je veux que la fonction s'arrête et arrête toutes les fonctions qui en dépendent.

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

127
forkandwait

Voir help(tryCatch):

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

et plus tard sous 'Voir aussi':

Les conditions de signal 'stop' et 'warning' et 'try' sont essentiellement une version simplifiée de 'tryCatch'.

donc vous voulez probablement stop.

100
Dirk Eddelbuettel

Exemple simple:

f <- function(a, b){ 

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

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

Le paquet R.oo possède une fonctionnalité supplémentaire de gestion des exceptions, y compris une fonction throw () qui est très utile. Vous pouvez intercepter des 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
Shane

En fait, la fonction stopifnot est très pratique pour implémenter des vérifications de sécurité dans votre code. Il prend plusieurs expressions logiques et renvoie une erreur si l'une d'entre elles est évaluée à false.

Exemple: pour vérifier si la colonne 'c' existe dans la trame de données 'df':

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

Cela provoquera l'erreur suivante:

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

Vous pouvez vérifier si la colonne existe et faire ce que vous voulez.
Supposons 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

1
xm1