34 votes

Arrêter un programme R sans erreur

Existe-t-il un moyen d'arrêter un programme R sans erreur ?

Par exemple, j'ai une source importante, qui définit plusieurs fonctions et qui est suivie d'appels à ces fonctions. Il arrive que je modifie une fonction et que je veuille que les définitions de fonctions soient mises à jour dans l'environnement R, mais qu'elles ne soient pas réellement appelées.

J'ai défini une variable justUpdate et lorsqu'il est TRUE vous souhaitez arrêter le programme juste après la définition des fonctions.

ReadInput <- function(...) ...
Analyze <- function(...) ...
WriteOutput <- function(...) ...

if (justUpdate)
    stop()
# main body
x <- ReadInput()
y <- Analyze(x)
WriteOutput(y)

J'ai appelé stop() mais le problème est qu'elle affiche un message d'erreur.

ctrl + c est une autre option, mais je veux arrêter la source sur une ligne spécifique.

Le problème avec q() ou quit() est qu'il met fin à la session R, mais j'aimerais que la session R reste ouverte.

Comme l'a proposé @JoshuaUlrich browser() peut être une autre option, mais elle n'est pas encore parfaite, car la source se termine dans un nouvel environnement (c'est-à-dire que l'invite R devient Browser[1]> plutôt que > ). Nous pouvons néanmoins appuyer sur Q Je ne sais pas si j'ai envie d'arrêter, mais je cherche la solution la plus simple.

Une autre option consiste à utiliser if (! justUpdate) { main body } mais il s'agit d'une compensation du problème, pas d'une solution.

Existe-t-il une meilleure option ?

24voto

Stibu Points 9657

J'ai trouvé une solution plutôt soignée aquí . L'astuce consiste à désactiver tous les messages d'erreur juste avant d'appeler stop() . La fonction on.exit() est utilisé pour s'assurer que les messages d'erreur sont réactivés par la suite. La fonction se présente comme suit :

stop_quietly <- function() {
  opt <- options(show.error.messages = FALSE)
  on.exit(options(opt))
  stop()
}

La première ligne désactive les messages d'erreur et stocke l'ancien paramètre dans la variable opt . Après cette ligne, toute erreur qui se produit n'émettra pas de message et, par conséquent, également un message d'erreur. stop() n'entraîne l'impression d'aucun message.

Selon l'aide R,

on.exit enregistre l'expression donnée en argument comme devant être exécutée à la sortie de la fonction en cours.

La fonction actuelle est stop_quietly() et il s'arrête lorsque stop() est appelé. La dernière chose que fait le programme est donc d'appeler options(opt) qui définira show.error.messages à la valeur qu'elle avait avant stop_quietly() a été appelé (probablement, mais pas nécessairement, TRUE ).

14voto

Vangelis Tasoulas Points 264

Il existe une solution intéressante dans une liste de diffusion aquí qui définit un stopQuietly qui, en gros, est la suivante cache l'erreur affichée par le stop fonction :

stopQuietly <- function(...) {
  blankMsg <- sprintf("\r%s\r", paste(rep(" ", getOption("width")-1L), collapse=" "));
  stop(simpleError(blankMsg));
} # stopQuietly()

> stopQuietly()

9voto

xm1 Points 387

J'ai un problème similaire et, en me basant sur la réponse de @VangelisTasoulas, j'ai trouvé une solution simple.
Dans les fonctions, je dois vérifier si la base de données est mise à jour. Si ce n'est pas le cas, j'arrête l'exécution.

r=readline(prompt="Is DB updated?(y/n)")
Is DB updated?(y/n)n
if(r != 'y') stop('\r Update DB')
Update DB

Il suffit de mettre \r au début du message, remplacer Error: dans le message.

7voto

Joshua Ulrich Points 68776

Vous recherchez la fonction browser .

5voto

Vous pouvez utiliser la solution suivante pour arrêter un programme R sans erreur :

if (justUpdate)
    return(cat(".. Your Message .. "))

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