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

Pet*_*ter 7 r

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

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

就像是:

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

   setTimeLimit(XXX seconds) {
      downloadFunction()
   } timeLimitReached {
      doOverFlag <- 1
   }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

kas*_*rma 11

evalWithTimeout包的功能就是R.utils这样.

evalWithTimeout(Sys.sleep(10), timeout = 1)
Run Code Online (Sandbox Code Playgroud)

(时间以秒为单位).

注意:我没有经常使用这个功能,我喜欢你的问题所以我做了一些谷歌搜索并找到了这个.

  • `withTimeout`是更新的功能 (4认同)

Bra*_*sen 6

在某些情况下,我真的很喜欢 R.utils,但是如果有的话,它会破坏内部错误消息的回溯(假设您正在并行运行并希望将其包装在超时中)

R base 具有setTimeLimit您可以{}与表达式一起使用的功能。它返回一条简单的错误消息,因此非常有用,并且不会消除其他错误处理的可能性(例如withCallingHandlers这对于解析/存储错误消息和调用堆栈非常有用):

test_fun <- function() { 
  repeat {
    runif(100)
  }
}

res <- { 
  setTimeLimit(5)
  test_fun()
}
Run Code Online (Sandbox Code Playgroud)