限制函数在R for循环中处理的时间

0ve6wy6x  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(144)

我想应用一个函数(“foo”用于此解释)将数据向量转换为另一个值。此函数将数据作为输入,并需要将表单提交到网页。有时,此过程进行得很快,而其他时候,可能需要很长时间我想运行for循环(或等效的apply函数)以跳过花费太长时间的项目的方式。我已经尝试使用以下命令限制循环运行的时间,然后跳到下一个5秒:

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循环中应用“next”条件。我已经寻找了更清楚的解释,但在这里没有得到任何运气。

cvxl0en2

cvxl0en21#

来自包R.utilswithTimeout()tryCatch()一起可以提供更清洁的解决方案。
例如:

require(R.utils)

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

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

在上面的人工例子中:

  • withTimeout()的第一个参数包含要在每个循环中计算的代码。
  • withTimeout()timeout参数以秒为单位设置时间限制。
  • tryCatch()TimeoutException参数接受一个将在循环迭代超时时执行的函数。
bgibtngc

bgibtngc2#

我正在用%dopar%在foreach中创建一个循环,所以运行错误消息让我很头疼,因为这会破坏循环。
我每次都创建跳过变量,当超时发生时,循环进入下一次迭代。希望在使用合作函数时避免任何“停止”或“中断”。

for(i in 1:5) {
     res=NULL
     skip=FALSE
    tryCatch(
      {res= withTimeout({Sys.sleep(i); 
       cat(i, "\n")},  timeout = 3.1, 
       onTimeout='error')
        }, 
     TimeoutException = function(ex){skip <<- 
        TRUE})
    if(skip){next}
}

相关问题