39 votes

R script - Comment poursuivre l'exécution du code en cas d'erreur

J'ai écrit un R script qui comprend une boucle qui récupère des données externes (web). Le format des données sont la plupart du temps les mêmes, cependant parfois le format change d'une manière imprévisible et ma boucle se plante (arrête de fonctionner).

Existe-t-il un moyen de poursuivre l'exécution du code sans tenir compte de l'erreur ? Je cherche quelque chose de similaire à "On error Resume Next" de VBA.

Merci d'avance.

48voto

Richie Cotton Points 35365

Utilisez try o tryCatch .

for(i in something)
{
  res <- try(expression_to_get_data)
  if(inherits(res, "try-error"))
  {
    #error handling code, maybe just skip this iteration using
    next
  }
  #rest of iteration for case of no error
}

La façon moderne de procéder utilise purrr::possibly .

Tout d'abord, écrivez une fonction qui récupère vos données, get_data() .

Modifiez ensuite la fonction pour qu'elle renvoie une valeur par défaut en cas d'erreur.

get_data2 <- possibly(get_data, otherwise = NA)

Maintenant, appelez la fonction modifiée dans la boucle.

for(i in something) {
  res <- get_data2(i)
}

8voto

MånsT Points 859

Vous pouvez utiliser try :

# a has not been defined
for(i in 1:3)
{
  if(i==2) try(print(a),silent=TRUE)
  else print(i)
}

5voto

Matt Dowle Points 20936

Que pensez-vous de ces solutions sur cette question connexe ?

Existe-t-il un moyen de `source()` et de continuer après une erreur ?

Soit parse(file = "script.R") suivi d'une boucle d try(eval()) sur chaque expression du résultat.

Ou le evaluate paquet.

0voto

Simon.S.A. Points 908

Si tout ce dont vous avez besoin est de faire un petit nettoyage, alors on.exit() est peut-être l'option la plus simple. Elle exécutera l'expression "lorsque la fonction courante se termine (soit naturellement, soit à la suite d'une erreur)" ( documentation ici ).

Par exemple, l'opération suivante supprimera my_large_dataframe que ce soit output_to_save est créé.

on.exit(rm("my_large_dataframe"))

my_large_dataframe = function_that_does_not_error()
output_to_save = function_that_does_error(my_large_dataframe)

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