7 votes

Fonctions ne s'exécutant pas avant Sys.sleep()

Je suis en train d'écrire une fonction qui doit capturer une erreur de limitation de taux lors de l'interrogation d'une API basée sur le web.

J'utilise tryCatch pour capturer l'erreur, et à l'intérieur de cette fonction, je spécifie la fonction d'erreur suivante:

error=function(e) {
                warning(paste(e,"\nEn attendant une heure pour que la limite de taux se réinitialise..."))
                Sys.sleep(3600) # Attendre une heure pour que la limite de taux se réinitialise
                return(user.info(user, ego.count))
            }

La fonction semble fonctionner, mais en vérifiant les journaux de sortie du script, je remarque que le message d'avertissement n'est pas écrit avant que le temps de sommeil ne soit écoulé.

Je peux reproduire ce comportement dans la console R avec:

print("Drew sucks")
Sys.sleep(10)

Dix secondes s'écoulent avant que Drew sucks ne soit imprimé dans la console. Dans ma fonction, je voudrais fournir un retour à l'utilisateur sur cette longue pause avant que la pause ne se produise.

Qu'est-ce qui cause ce comportement?

8voto

Joshua Ulrich Points 68776

Vous devez soit définir immediate.=TRUE pour votre fonction d'avertissement, soit définir options(warn=1); et peut-être devoir ajouter flush.console() (sur certains systèmes d'exploitation) avant l'appel à Sys.sleep().

foo <- function() {
  warning("oh-oh...", immediate.=TRUE)
  flush.console()
  Sys.sleep(5)
  "terminé"
}
foo()
# Avertissement dans foo() : oh-oh...
# [1] "terminé"

Les détails sont expliqués dans la section "Détails" de ?warning. Pour paraphraser, "si options(warn=0), les avertissements sont stockés et imprimés après que la fonction de niveau supérieur a été complétée; si options(warn=1) ils sont imprimés au fur et à mesure."

3voto

geoffjentry Points 2151

Par défaut, les avertissements ne sont pas imprimés immédiatement, ils sont imprimés une fois que la fonction de niveau supérieur est terminée. Vous pouvez définir warn sur '1' si vous voulez qu'il soit imprimé immédiatement, et même plus si vous voulez l'arrêter

3voto

mjbommar Points 469

Pour le plaisir, essayez :

system(sprintf('sleep %d', seconds))

En supposant que vous avez la commande de sommeil *NIX habituelle sur le chemin.

2voto

hadley Points 33766

Probablement lié à la mise en tampon de sortie - voir ?flush.console

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