2017-09-13 12 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) 
} 

이것은 내가 지금까지 가지고있는 것입니다. 시뮬레이션이 시간 제한을 초과하는지 여부에 관계없이 "i"인쇄를 계속하고 싶지만 현재는 "도달 된 CPU 시간 제한"오류 및 중지를 제공합니다.

답변

0

소스로 https://www.rdocumentation.org/packages/R.utils/versions/2.5.0/topics/withTimeout을 사용합니다. 예상대로 작동하는 테스트 유닛이 있습니다. 마리화나가 잡을하지만 건너 위해 TimeoutException를 사용하기 위해 언급으로

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를 사용 적절한 시간 제한

시간 제한이 너무 낮게 설정 문제도있다 :

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

당신은 할 수 있습니다

단순히 setTimeLimit에게 자신과 ensur를 사용하는이 즉, transient은 TRUE로 설정되어 있습니다.

다음은 실제로 꽤, TimeoutException가 tryCatch로 잡은 예외는 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

이것은 예제에서 완벽하게 작동합니다. 내가 foo에서 "sim.rateshift.taxa (10,1, c (0.5,2), c (0.5,0), c (1,1), c (0,0.5), complete = F)), 대부분의 시간은 작동하지만 제한 시간 한도에 따라 다릅니다. 한계를 너무 낮게 설정하면 기능이 "CPU 시간 한계에 도달했습니다"오류로 중단됩니다. 나는 foo를 더 낮은 한계로 더 자주 건너 뛸 것이라고 생각했을 것이다. –

+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

에서 촬영 한 예입니다. 실제 예제는 https://www.rdocumentation.org/packages/R.utils/versTime/2.5.0/topics/withTimeout을 참조하십시오. –

+1

감사합니다. 그러나 오류 코드를 사용하면 Rstudio에서 작동하지만 원본 코드에서는 작동하지 않습니다. 그 이유가 무엇인지 모르겠지만 답변의 코드가 문제를 해결하므로 친절히 아래 표를 다시 생각해보십시오. – thc

+0

그 이유는 sim.rateshift.taxa가 다른 오류를 던지고 있기 때문입니다. –