R - 在循环中设置执行时间限制

时间:2015-07-16 19:00:47

标签: r

我有一个使用rNOMADS包下载预测数据的脚本。目前,它使用for循环按顺序调用每三小时预测间隔的预测下载功能。问题是偶尔下载功能&#34;冻结&#34;随意地迫使我终止R并开始这个过程。当它冻结时,代码会在下载功能中挂起几分钟而不是执行所需的典型值<1秒,然后当我尝试暂停执行时,我会收到一条消息,说明&#34; R没有响应您的请求中断处理,以便停止当前操作,您可能需要完全终止R.&#34;

是否有办法为每个for循环迭代中的特定代码块设置时间限制,然后跳过该代码块并在达到时间限制时抛出错误?像tryCatch这样的东西,我可以用来引发一个标志来重新做循环迭代吗?

类似的东西:

for (i in 1:N) {
   ...

   setTimeLimit(XXX seconds) {
      downloadFunction()
   } timeLimitReached {
      doOverFlag <- 1
   }
}

提前致谢!

3 个答案:

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