我想要应用一个函数(这个解释是“foo”)来将一个数据向量转换为另一个值。此函数将数据作为输入,需要向网页提交表单。有时,这会很快发生,而有时,它可能会持续很长一段时间。我想运行for循环(或等效的应用函数),跳过耗时太长的项目。在跳到下一个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‘条件。一直在寻找一个更清晰的解释,但在这里没有得到任何幸运。
发布于 2011-12-28 15:22:29
来自R.utils包的withTimeout()与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()的第一个参数包含每个循环中要计算的代码。timeout参数withTimeout()设置时间限制(以秒为单位)。TimeoutException参数采用循环迭代超时时要执行的函数。https://stackoverflow.com/questions/8652681
复制相似问题