Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Functions not executing before Sys.sleep()

Tags:

r

system

I am writing a function that needs to catch a rate-limiting error while pinging a web-based API.

I am using tryCatch to catch the error, and inside this function I specify the following error function:

error=function(e) {
                warning(paste(e,"\nWaiting an hour for rate limit to reset..."))
                Sys.sleep(3600) # Wait an hour for rate-limit to reset
                return(user.info(user, ego.count))
            }

The function appears to work, but when checking the output logs for the script I notice that the warning message is not written until after the sleep time has run out.

I can reproduce this behavior at the R console with:

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

Ten seconds pass before Drew sucks is printed to the console. In my function, I would like to provide some feedback to the user about this long pause before the pause happens.

What is causing this behavior?

like image 957
DrewConway Avatar asked May 31 '11 21:05

DrewConway


1 Answers

You need to either set immediate.=TRUE to your warning function, or set options(warn=1); and may need to add flush.console() (on some operating systems) before the Sys.sleep() call.

foo <- function() {
  warning("uh-oh...", immediate.=TRUE)
  flush.console()
  Sys.sleep(5)
  "done"
}
foo()
# Warning in foo() : uh-oh...
# [1] "done"

The specifics are spelled out in the "Details" section of ?warning. To paraphrase, "if options(warn=0), warnings are stored and printed after the top-level function has completed; if options(warn=1) they are printed as they occur."

like image 131
Joshua Ulrich Avatar answered Sep 25 '22 04:09

Joshua Ulrich