2012-09-20 35 views
3

後用一個簡單的測試功能setTimeLimit仍然存在函數完成

timefoo<-function(x,trans=TRUE){ 
setTimeLimit(elapse=4, transient=trans) 
warning('starting...') 
Sys.sleep(x) 
warning('woke up') 
return(x) 
} 

功能正常終止當我打電話,說,timefoo(5),但:

timefoo(3) 
[1] 3 
Warning messages: 
1: In timefoo(3) : starting... 
2: In timefoo(3) : woke up 
Error: reached elapsed time limit 

有人能解釋究竟是怎麼回事?就好像setTimeLimittimefoo完成並退出後繼續運行。設置transient=FALSE更糟,因爲它然後爲我的控制檯命令設置超時,並在每個命令(加上4秒)後給我錯誤消息。

編輯:響應於加文的問題,這裏有兩個電話

Rgames> timefoo(5) 
Error in Sys.sleep(x) : reached elapsed time limit 
In addition: Warning message: 
In timefoo(5) : starting... 
Rgames> timefoo(3) 
[1] 3 
Warning messages: 
1: In timefoo(3) : starting... 
2: In timefoo(3) : woke up 
Error: reached elapsed time limit 

我手動等待命令之間10秒的順序,所以毫無疑問,最後的錯誤信息是由於timefoo(3)通話。是否有任何R_ENVIRON變量可能會導致此行爲?我只在Windows7,R64上測試過。

+0

'timefoo(3)'適合我,沒有錯誤。 –

+0

我想知道第二個錯誤是否來自早些時候運行'timefoo(5)'?我得到了as.name(name)中的錯誤:達到了經過的時間限制,然後是'警告消息:在.completeToken():在timefoo(3)'後面隨機重新啓動中斷的promise評估'。重試'timefoo(3)'並沒有在第二次產生任何類似的東西。 –

回答

3

我得到相同的錯誤信息(在Win 7下運行R-2.16 devel)。

幫助頁面?setTimeLimit狀態:

「setTimeLimit」將其應用到每個頂級計算, 那是一個命令行(包括任何延續行)在 控制檯或輸入限制從文件。

所以它不是真的被設計成從一個函數內部運行。如果你想這樣做,那麼試試這個選擇:

timed_computation <- function(expr, time_limit = 1) 
{ 
    setTimeLimit(elapsed = time_limit, transient = TRUE) 
    ans <- expr 
    setTimeLimit(elapsed = Inf, transient = TRUE) 
    ans 
} 

timed_computation(1 + 1)   #should return 2 
timed_computation(Sys.sleep(2))  #should throw an error 
+0

是的,解決了這個問題。我懷疑,「真正的」答案是,我不應該使用'setTimeLimit'作爲強制函數運行很長時間的超時方法。 '特別是現在'evalWithTimeout'在'utils'包中。 –

相關問題