2017-09-13 111 views
0

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

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) 
} 

这是我到目前为止。我希望它继续打印“我”,无论模拟是否超过时间限制,但目前它给我“达到CPU时间限制”的错误和停止。

回答

0

使用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自己和ensur那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 
+0

这个例子中完美的作品。当我用“sim.rateshift.taxa(10,1,c(0.5,2),c(0.5,0),c(1,1),c(0,0.5),complete = F)”代替foo ),它在大多数时间都有效,但依赖于时间限制。将限制设置得太低会导致功能因错误“达到CPU时间限制”而中断。我会认为它会更频繁地跳过下限。 –

+0

您遇到的问题也与R.utils实现有关。我已经更新了答案 –

0

试试这个:

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 = ...也会捕获任何其他问题。

+0

采取的例子其实不大,TimeoutException异常是tryCatch捕捉到的异常。有关实际示例,请参阅https://www.rdocumentation.org/packages/R.utils/versions/2.5.0/topics/withTimeout –

+1

谢谢,但在Rstudio中使用'error'工作,而原始代码不能。我不确定原因是什么,但答案中的代码可以解决他的问题,所以请重新考虑您的投票结果。 – thc

+0

它工作的原因是因为sim.rateshift.taxa正在抛出一些其他错误。 –