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 ?

1voto

Chris Points 73

Juste return quelque chose à la ligne où vous voulez quitter la fonction :

f <- function(x, dry=F) { 
   message("hi1")
   if (dry) return(x)
   message("hi2")
   x <- 2*x 
}
y1 <- f(2) # = 4 hi1 hi2
y2 <- f(2, dry=T) # = 2 hi1

0voto

LearnUseZone Points 43

En complément de la réponse de Stibu le 22 mars 17 à 7:29, si vous voulez écrire un message dans le cadre de stop(), ce message n'est pas écrit.

Je trouve étrange que les deux lignes suivantes doivent être utilisées car on.exit(options(options(show....))) ne fonctionne pas.

opt <- options(show.error.messages = F)
on.exit(options(opt))

0voto

Thell Points 2772

J'avais oublié la réponse à cette question et j'ai eu besoin de la rechercher et j'ai atterri ici... Vous avez posté l'indice de la réponse dans votre question...

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

Signaler une erreur, un avertissement ou un message

rlang::inform("Updated Only")
rlang::interrupt()

0voto

Jordan Points 46

J'ai constaté qu'il était bon d'écrire un script et de l'exécuter avec source() . Dans le script, une instruction de sortie est une classe spéciale d'erreur qu'une personne de l'équipe de gestion de l'information peut commettre. tryCatch() peut prendre et renvoyer comme un simple message :

exit <- function(..., .cl = NULL) {
  # Use to capture acceptable stop
  cond <- structure(
    list(.makeMessage(...), .cl),
    class = c("exitError", "error", "condition"),
    names = c("message", "call")
  )

  stop(cond)
}

foo <- function() {
  exit("quit here")
  1
}

tryCatch(
  # rather than foo(), you might use source(filename)
  foo(),
  exitError = function(e) message(e$message)
)
#> quit here

Créé le 2022-01-24 par le paquet reprex (v2.0.1)

-1voto

user1697590 Points 93

Pourquoi ne pas utiliser un if () {} else {} ? Il ne s'agit que de quelques caractères...

f1 <- function(){}
f2 <- function(){}

if (justUpdate) {
} else {
# main body 
}

ou même

f1 <- function(){}
f2 <- function(){}

if (!justUpdate) {
# main body 
}

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