2017-09-13 113 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正在拋出一些其他錯誤。 –