【问题标题】:R - Set execution time limit in loopR - 在循环中设置执行时间限制
【发布时间】:2015-07-16 19:00:47
【问题描述】:

我有一个使用 rNOMADS 包下载预测数据的脚本。目前,它使用for循环按顺序调用每三个小时预测间隔的预测下载函数。问题是下载功能偶尔会随机“冻结”,这迫使我终止 R 并重新开始该过程。当它冻结时,代码会在下载功能处挂起几分钟,而不是执行所需的典型

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

类似:

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

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

提前致谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    R.utils 的函数evalWithTimeout 执行此操作。

    evalWithTimeout(Sys.sleep(10), timeout = 1)
    

    (时间以秒为单位)。

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

    【讨论】:

    • withTimeout 是较新的函数
    【解决方案2】:

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

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

    test_fun <- function() { 
      repeat {
        runif(100)
      }
    }
    
    res <- { 
      setTimeLimit(5)
      test_fun()
    }
    

    【讨论】:

    • res &lt;- { setTimeLimit(2) Sys.sleep(10) } 不工作
    • 它不适用于Sys.sleep()。你是对的。你需要“计算”一些东西(就像上面的例子)。
    【解决方案3】:

    这个函数现在工作如下:

    library(R.utils)
    withTimeout(Sys.sleep(10), timeout = 1)#stop execution after one second
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 2021-10-25
      • 2016-04-15
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多