2011-12-28 34 views
5

我想將一個函數(「foo」用於此解釋)轉換爲另一個數據向量。該功能將數據作爲輸入,並需要將表單提交給網頁。有時候,這很快,而其他時候,這可能會很長時間。我想運行for循環(或等價的應用函數),以跳過花費太長時間的項目。我曾嘗試使用跳到下一個5秒前限制循環運行時間如下:限制函數在R for循環中處理的時間

pb <- txtProgressBar(min = 1, max = 100, style = 3) 
storage <- matrix(nrow = sample.length, ncol = 2) 

for(i in 1:100){ 
    s <- Sys.time() 
    storage[i,] <- try(foo(data.vec[i]), TRUE) 
    if (Sys.time() - s >5) {next} 
    # update progress bar 
    setTxtProgressBar(pb, i) 
} 
close(pb) 

我想,我不能瞭解如何應用「下一個」條件在for循環中。已經搜尋找到一個更清晰的解釋,但沒有在這裏得到任何運氣。

+0

您的foo()在完成之前不會返回到Sys.time。我想要實現跳過,你必須在foo函數中添加類似的代碼;或者在單獨的線程中運行foo,但這並不容易。 – 2011-12-28 07:02:58

+0

'evalWithTimeout'示例就是要走的路。否則:或許你用來調用網頁(或其他)的實際功能有一個內置的超時參數?值得深入研究的文件,如果你還沒有這樣做。 – 2011-12-28 16:18:25

回答

9

evalWithTimeout()來自包R.utils,與tryCatch()一致,可能提供更清潔的解決方案。

例如:

require(R.utils) 

for(i in 1:5) { 
    tryCatch(
     expr = { 
      evalWithTimeout({Sys.sleep(i); cat(i, "\n")}, 
          timeout = 3.1) 
      }, 
     TimeoutException = function(ex) cat("Timeout. Skipping.\n") 
    ) 
} 

# 1 
# 2 
# 3 
# Timeout. Skipping. 
# Timeout. Skipping. 

在上述人造例如:

  • 的第一個參數evalWithTimeout()包含的代碼給每個循環中進行評估。

  • timeout參數evalWithTimeout()以秒爲單位設置時間限制。

  • tryCatch()TimeoutException參數採用在循環的迭代超時時執行的函數。