web-dev-qa-db-fra.com

Comment puis-je arrêter / terminer / arrêter un script dans R?

J'ai écrit un script qui devrait arrêter l'exécution si les données fournies sont incorrectes. Cependant, bien que stop génère un message d'erreur, le script continue simplement. Un exemple minimal:

if (TRUE) {stop("End of script?")} #It should stop here
print("Script did NOT end!") # but it doesn't, because this line is printed!

Sortie console:

> if (TRUE) {stop("End of script?")}
Error: End of script?
> print("Script did NOT end!")
[1] "Script did NOT end!"
>

Ce n'est en fait pas surprenant, car à partir de ?stop:

arrête l'exécution de l'expression actuelle et exécute une action d'erreur.

Il ne fait donc que terminer l'expression en cours, pas le script. J'ai trouvé ici que vous pouvez envelopper {} autour du script total (ou le mettre dans une fonction), mais cela semble plutôt une solution de contournement qu'une solution. Bien sûr, c'est une bonne pratique de programmation de détecter les erreurs et de les gérer vous-même (voir par exemple le lien dans le commentaire de mra68), mais je voudrais quand même savoir si je peux arrêter un script dans R.

J'ai également essayé return et break, mais cela ne fonctionne que dans une fonction ou une boucle. J'ai recherché d'autres mots clés possibles tels que "arrêter" et "terminer", mais pas de chance. Je me sens un peu stupide, car cela semble une question très basique.

Donc, y a-t-il une commande qui peut arrêter/arrêter/terminer mon script avec une erreur fatale?

J'utilise R 3.2.3 sur Windows 8, mais j'ai eu le même problème avec R 3.0.1 sous MAC-OSX.

> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=Dutch_Netherlands.1252  LC_CTYPE=Dutch_Netherlands.1252    LC_MONETARY=Dutch_Netherlands.1252
[4] LC_NUMERIC=C                       LC_TIME=Dutch_Netherlands.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.2.3

TEST SUR MAC-OS, sessionInfo ()

R version 3.0.1 (2013-05-16)
Platform: x86_64-Apple-darwin10.8.0 (64-bit)

locale:
[1] nl_NL.UTF-8/nl_NL.UTF-8/nl_NL.UTF-8/C/nl_NL.UTF-8/nl_NL.UTF-8
22
RHA

Pour autant que je puisse trouver, il n'y a aucune commande unique qui arrête vraiment un script sur chaque plate-forme/version. Il existe plusieurs façons de gérer cela:

Mettez-le dans une fonction ou des accolades:

{
if (TRUE) {stop("The value is TRUE, so the script must end here")}

print("Script did NOT end!")
}

OU évaluez l'erreur et traitez-la comme dans une construction if else:

if (TRUE) {stop("The value is TRUE, so the script must end here")    
  } else { #continue the script
print("Script did NOT end!")   
  }

OU (MODIFIER): Une autre possibilité est d'appeler le script à partir d'un R-scipt "principal" séparé, avec source("MyScript.R"). Ensuite, le script se termine. Cependant, cela supprime toutes les sorties autres que les erreurs sur la console.

OU pour des opérations plus complexes, utilisez tryCatch() comme indiqué ici

9
RHA

c'est peut-être un peu trop tard, mais j'ai récemment rencontré le même problème et j'ai trouvé que la solution la plus simple pour moi était d'utiliser:

quit(save="ask")

De ?quit tu peux voir ça:

enregistrer doit être "non", "oui", "demander" ou "par défaut". Dans le premier cas, l'espace de travail n'est pas enregistré, dans le second, il est enregistré et dans le troisième, l'utilisateur est invité et peut également décider de ne pas quitter. La valeur par défaut est de demander en utilisation interactive mais peut être remplacée par des arguments de ligne de commande (qui doivent être fournis en utilisation non interactive).

Vous pouvez alors décider de ne pas quitter R en cliquant sur "Annuler" lorsque la boîte de message apparaîtra.

J'espère que cela pourra aider!

7
NonoRbrico