在Sys.sleep()之前不执行的函数

时间:2011-05-31 21:39:01

标签: r system

我正在编写一个函数,需要在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打印到控制台之前经过十秒钟。在我的功能中,我想在暂停发生之前向用户提供关于这个长暂停的一些反馈。

导致此行为的原因是什么?

4 个答案:

答案 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