在 R 中的循环中跳过慢速任务

Skipping slow tasks in a loop in R

我正在尝试 运行 在 R 中进行模拟,在那里我制作了一大堆系统发育树。树模拟有点问题,因为它的 运行 时间变化很大,有时是 0.005 秒,有时是几分钟。我想避开慢树,所以我试图使用 evalWithTimeout 来跳过它们。到目前为止,我遇到了问题,因为我无法在不终止循环的情况下终止慢速任务。 我的问题与 this question 类似,但该问题的解决方案对我没有帮助。

library(TreeSim)
library(R.utils)
for (i in 1:100){
  tryCatch(
    expr = {
      evalWithTimeout(sim.rateshift.taxa(10,1,c(0.5,2),c(0.5,0),
                                         c(1,1),c(0,0.5),complete=F),
      timeout=0.005)
    }, 
    TimeoutException = function(ex) cat("Timeout. Skipping.\n")
  )
  print(i)
}

这就是我目前所拥有的。我希望它继续打印 "i",无论模拟是否超过时间限制,但目前它给我 "reached CPU time limit" 错误并停止。

试试这个:

library(TreeSim)
library(R.utils)
for (i in 1:100){
  tryCatch(
    expr = {
      evalWithTimeout(sim.rateshift.taxa(10,1,c(0.5,2),c(0.5,0),
                                         c(1,1),c(0,0.5),complete=F), timeout=0.005)
    }, error = function(ex) cat("Timeout. Skipping.\n"))
  print(i)
}

正如@AhmedMasud 在评论中提到的那样,该函数引发了不同的错误。因此,使用 error = ... 也可以解决任何其他问题。

使用 https://www.rdocumentation.org/packages/R.utils/versions/2.5.0/topics/withTimeout 作为来源。这是一个按预期工作的测试单元。

foo = function() {
    print("Tic");
    x <- ceiling(runif(1) * 100)+1;
    for (kk in 1:x) {
        print(kk);
        Sys.sleep(runif(1));
    }
    print("Tac");
}

bar = function() { 
  for (i in 1:100) { 
    tryCatch({
      res <- withTimeout({
        foo();
     }, timeout=1.08);
    }, TimeoutException=function(ex) {
        cat("Timeout. Skipping.\n");
       }); 
    print(i); 
   } 
}

所以问题是,是否存在未被捕获的 sim.rateshift.taxa 中断引发的错误,使用 error 作为 thc 提到的以捕获该错误,但使用 TimeoutException 来跳过适当的超时

还有一个时间限制设置过低的问题:

https://github.com/mhahsler/arules/issues/22

您可能只想自己使用 setTimeLimit 并确保 transient 设置为 TRUE,这样您就可以更好地控制。

这是一个取自 http://blog.revolutionanalytics.com/2014/10/r-in-production-controlling-runtime.html

的示例
system.time(Sys.sleep(5))

##user system elapsed 
## 0.000 0.000 5.005

system.time(local({
  setTimeLimit(elapsed = 1, transient = TRUE)
  Sys.sleep(5)
}))

## Error in Sys.sleep(5): reached elapsed time limit

## Timing stopped at: 0 0 5.006