问题描述
|
我正在编写一个函数,该命令在对基于Web的API进行ping操作时需要捕获速率限制错误。
我正在使用
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)
在将“ 3”打印到控制台之前十秒钟。在我的职能中,我想在暂停发生之前向用户提供一些有关此长时间暂停的反馈。
是什么导致此行为?
解决方法
对于它的地狱,请尝试:
system(sprintf(\'sleep %d\',seconds))
假设您在路径上具有通常的* NIX sleep命令。
, 您需要将immediate.=TRUE
设置为警告功能,或将options(warn=1)
设置为1。并且可能需要在调用Sys.sleep()
之前添加flush.console()
(在某些操作系统上)。
foo <- function() {
warning(\"uh-oh...\",immediate.=TRUE)
flush.console()
Sys.sleep(5)
\"done\"
}
foo()
# Warning in foo() : uh-oh...
# [1] \"done\"
细节在ѭ10“的“详细信息”部分中阐明。换句话说,“如果选项(警告= 0),警告将在顶级功能完成后存储并打印;如果选项(警告= 1),则会在出现警告时将它们打印出来。”
, 默认情况下,警告不会立即打印出来,而是在返回顶层函数后立即打印出来。如果您希望立即将其打印出来,可以将警告设置为“ 1”,如果要使其停止,可以将警告设置为更高
, 可能与输出缓冲有关-参见?flush.console