Функции, не выполняющиеся до Sys.sleep () - PullRequest
7 голосов
/ 01 июня 2011

Я пишу функцию, которая должна отлавливать ошибку ограничения скорости при пинге веб-интерфейса API.

Я использую tryCatch, чтобы перехватить ошибку, и внутри этой функции я указываю следующеефункция ошибки:

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))
            }

Эта функция работает, но при проверке журналов вывода для сценария я замечаю, что предупреждающее сообщение не записывается до тех пор, пока после не истечет время ожидания.

Я могу воспроизвести это поведение на консоли R с помощью:

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

За десять секунд до того, как Drew sucks будет напечатано на консоли.В своей функции я хотел бы предоставить некоторую обратную связь пользователю об этой длинной паузе до ее возникновения.

Что вызывает такое поведение?

Ответы [ 4 ]

8 голосов
/ 01 июня 2011

Вам нужно либо установить immediate.=TRUE для вашей функции предупреждения, либо установить options(warn=1); и может необходимо добавить flush.console() (в некоторых операционных системах) перед вызовом Sys.sleep().

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

Подробности изложены в разделе «Подробности» ?warning. Перефразируя, "если параметры (warn = 0), предупреждения сохраняются и печатаются после завершения функции верхнего уровня; если параметры (warn = 1), они печатаются по мере их появления."

3 голосов
/ 01 июня 2011

Черт возьми, попробуйте:

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

Предположим, у вас есть обычная команда * NIX sleep на пути.

3 голосов
/ 01 июня 2011

По умолчанию предупреждения не выводятся сразу, а выводятся после возврата из функции верхнего уровня. Вы можете установить предупреждение в '1', если хотите, чтобы оно распечатывалось немедленно, и даже выше, если вы хотите, чтобы оно прекратилось

2 голосов
/ 01 июня 2011

Возможно, связано с буферизацией вывода - см. ?flush.console

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...