2011-12-28 35 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参数采用在循环的迭代超时时执行的函数。