我有一个使用rNOMADS包下载预测数据的脚本。目前,它使用for循环按顺序调用每三小时预测间隔的预测下载功能。问题是偶尔下载功能&#34;冻结&#34;随意地迫使我终止R并开始这个过程。当它冻结时,代码会在下载功能中挂起几分钟而不是执行所需的典型值<1秒,然后当我尝试暂停执行时,我会收到一条消息,说明&#34; R没有响应您的请求中断处理,以便停止当前操作,您可能需要完全终止R.&#34;
是否有办法为每个for循环迭代中的特定代码块设置时间限制,然后跳过该代码块并在达到时间限制时抛出错误?像tryCatch这样的东西,我可以用来引发一个标志来重新做循环迭代吗?
类似的东西:
for (i in 1:N) {
...
setTimeLimit(XXX seconds) {
downloadFunction()
} timeLimitReached {
doOverFlag <- 1
}
}
提前致谢!
答案 0 :(得分:11)
包R.utils
的函数evalWithTimeout(Sys.sleep(10), timeout = 1)
执行此操作。
Google Webdesigner
(时间以秒为单位)。
注意:我没有经常使用这个功能,我喜欢你的问题所以我做了一些谷歌搜索并发现了这个。
答案 1 :(得分:3)
在某些情况下我真的很喜欢R.utils,但如果有一个内部错误消息,它会破坏内部错误消息的回溯(让我们说你并行运行并希望将其包装在超时中)
R base具有功能setTimeLimit
,您可以使用{}
将表达式包裹起来。它返回一个简单的错误消息,因此它非常有用,并且不会删除其他错误处理可能性(如withCallingHandlers
,这对于解析/存储错误消息和调用堆栈非常有用):
test_fun <- function() {
repeat {
runif(100)
}
}
res <- {
setTimeLimit(5)
test_fun()
}
答案 2 :(得分:2)
此功能现在如下:
library(R.utils)
withTimeout(Sys.sleep(10), timeout = 1)#stop execution after one second