Arrêter un programme R sans erreur
Est-il possible d'arrêter un programme R sans erreur?
par exemple j'ai une grande source, définissant plusieurs fonctions et après il y a quelques appels aux fonctions. Il arrive que je modifie une fonction, et que je souhaite que les définitions de fonction soient mises à jour dans l'environnement R, mais elles ne sont pas réellement appelées.
j'ai défini une variable justUpdate
et quand il est TRUE
vous voulez arrêter le programme juste après les définitions de fonction.
ReadInput <- function(...) ...
Analyze <- function(...) ...
WriteOutput <- function(...) ...
if (justUpdate)
stop()
# main body
x <- ReadInput()
y <- Analyze(x)
WriteOutput(y)
je ont appelé stop()
fonction, mais le problème est qu'il imprime un message d'erreur.
ctrl+ c est une autre option, mais je veux arrêter la source en ligne spécifique.
Le problème q()
ou quit()
c'est qu'il se termine R session, mais je voudrais avoir le R de la session reste ouverte.
@JoshuaUlrich proposé browser()
peut être une autre option, mais pas parfaite, car la source se termine par une nouvelle environnement (c'est-à-dire que L'invite R passera à Browser[1]>
plutôt que >
). Néanmoins, on peut appuyer sur Q
pour arrêter, mais je cherche la voie directe.
une Autre option est d'utiliser if (! justUpdate) { main body }
mais ça élimine le problème, pas le résoudre.
Est-il une meilleure solution?
5 réponses
Il y a une bonne solution dans une liste de diffusion ici qui définit un stopQuietly
la fonction que, fondamentalement masque l'erreur affiché à partir de la stop
fonction:
stopQuietly <- function(...) {
blankMsg <- sprintf("\r%s\r", paste(rep(" ", getOption("width")-1L), collapse=" "));
stop(simpleError(blankMsg));
} # stopQuietly()
> stopQuietly()
je l'ai trouvé plutôt soignée solution ici. Le truc est d'éteindre 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 rallumés après coup. La fonction ressemble à ceci:
stop_quietly <- function() {
opt <- options(show.error.messages = FALSE)
on.exit(options(opt))
stop()
}
la première ligne éteint les messages d'erreur et stocke l'ancien paramètre à la variable opt
. Après cette ligne, toute erreur qui se produit ne produira pas de message et par conséquent, aussi stop()
ne causera aucune message à imprimer.
selon le R help,
on.exit
enregistre l'expression donnée comme argument comme devant être exécutée lorsque la fonction courante sort.
la fonction courante est stop_quietly()
et il sort quand stop()
est appelée. Donc la dernière chose que le programme ne fait qu'appeler options(opt)
qui mettra show.error.messages
à la valeur qu'il avait, avant stop_quietly()
a été appelé (sans doute, mais pas nécessairement, TRUE
).
j'ai un problème similaire et, basé sur la réponse de @VangelisTasoulas, j'ai une solution simple.
À l'intérieur des fonctions, je dois vérifier si DB est mis à jour. Si elle n'est pas, arrêter 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 le mettre \r
au début du message, remplacer Error:
dans le message.
Vous pouvez utiliser la solution suivante pour arrêter un programme R sans erreur:
if (justUpdate)
return(cat(".. Your Message .. "))