112 votes

break/exit script

J'ai un programme qui fait de l'analyse de données et qui fait quelques centaines de lignes.

Très tôt dans le programme, je veux faire un contrôle de qualité et s'il n'y a pas assez de données, je veux que le programme se termine et retourne à la console R. Sinon, je veux que le reste du code s'exécute.

J'ai essayé break , browser et quit et aucune d'entre elles n'arrête l'exécution du reste du programme (et quit arrête l'exécution ainsi que l'abandon complet de R, ce qui n'est pas quelque chose que je veux voir se produire). Mon dernier recours est de créer un if-else comme ci-dessous :

 if(n < 500){}
 else{*insert rest of program here*}

mais cela semble être une mauvaise pratique de codage. Est-ce que quelque chose m'échappe ?

7voto

user2641103 Points 165

C'est une vieille question mais il n'y a pas encore de solution propre. Cela ne répond probablement pas à cette question spécifique, mais ceux qui cherchent des réponses sur 'comment sortir gracieusement d'un R script' vont probablement atterrir ici. Il semble que les développeurs de R aient oublié d'implémenter une fonction exit(). Quoi qu'il en soit, l'astuce que j'ai trouvée est la suivante :

continue <- TRUE

tryCatch({
     # You do something here that needs to exit gracefully without error.
     ...

     # We now say bye-bye         
     stop("exit")

}, error = function(e) {
    if (e$message != "exit") {
        # Your error message goes here. E.g.
        stop(e)
    }

    continue <<-FALSE
})

if (continue) {
     # Your code continues here
     ...
}

cat("done.\n")

Fondamentalement, vous utilisez un drapeau pour indiquer la poursuite ou non d'un bloc de code spécifique. Ensuite, vous utilisez le stop() pour transmettre un message personnalisé au gestionnaire d'erreur d'un fichier tryCatch() fonction. Si le gestionnaire d'erreur reçoit votre message de sortie en douceur, il ignore l'erreur et met le drapeau de continuation à la valeur FALSE .

2voto

Ici :

if(n < 500)
{
    # quit()
    # or 
    # stop("this is some message")
}
else
{
    *insert rest of program here*
}

Les deux sites quit() y stop(message) quittera votre script. Si vous créez votre script à partir de l'invite de commande R, alors quit() sortira de R également.

1voto

SwissChris Points 11

J'ai eu un problème similaire : Sortir de la fonction courante, mais ne pas vouloir terminer le reste du code. Finalement, je l'ai résolu par une boucle for() qui ne s'exécute qu'une fois. À l'intérieur de la boucle for, vous pouvez définir plusieurs conditions différentes pour quitter la boucle (fonction) actuelle.

  for (i in T) {
    print('hello')
    if (leave.condition) next
    print('good bye')
  }

0voto

Vous pouvez utiliser le pskill dans le R "tools" pour interrompre le processus en cours et revenir à la console. Concrètement, j'ai la fonction suivante définie dans un fichier de démarrage que je source au début de chaque script. Mais vous pouvez aussi la copier directement au début de votre code. Puis insérez halt() à tout moment dans votre code pour arrêter l'exécution du script à la volée. Cette fonction fonctionne bien sous GNU/Linux et, à en juger par le nombre d'utilisateurs de la fonction R il devrait également fonctionner sous Windows (mais je n'ai pas vérifié).

# halt: interrupts the current R process; a short iddle time prevents R from
# outputting further results before the SIGINT (= Ctrl-C) signal is received 
halt <- function(hint = "Process stopped.\n") {
    writeLines(hint)
    require(tools, quietly = TRUE)
    processId <- Sys.getpid() 
    pskill(processId, SIGINT)
    iddleTime <- 1.00
    Sys.sleep(iddleTime)
}

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