我正在编写一个函数,需要在ping基于Web的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
打印到控制台之前经过十秒钟。在我的功能中,我想在暂停发生之前向用户提供关于这个长暂停的一些反馈。
导致此行为的原因是什么?
答案 0 :(得分:8)
您需要将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
的“详细信息”部分中详细说明。换句话说,“如果选项(警告= 0),在顶级功能完成后存储并打印警告;如果选项(警告= 1),则会在它们出现时打印。”
答案 1 :(得分:3)
默认情况下,警告不会立即打印,而是在顶级函数返回后打印出来。您可以将警告设置为“1”(如果您希望立即打印出来),如果您希望停止打印则更高
答案 2 :(得分:3)
为了它的地狱,试试:
system(sprintf('sleep %d', seconds))
假设你在路径上有通常的* NIX睡眠命令。
答案 3 :(得分:2)
可能与输出缓冲相关 - 请参阅?flush.console