r - lapply 循环根据经过的时间跳到下一次迭代
问题描述
我想创建一个 lapply 循环,当当前迭代需要超过 60 秒才能完成时,它将跳到下一次迭代。该脚本包含一个 trycatch 来处理函数可能返回的错误。我尝试使用 withTimeout() 没有成功。
reg.out <- lapply(1:nrow(dt), function(i) {
reg.mets <- withTimeout(
tryCatch(
1 * dt$dim1[i]),
error = function(e) NULL),
timeout = 60,
onTimeout = "silent")
})
解决方案
你已经得到withTimeout
并tryCatch
翻转。
这是一个基于以下简单函数的最小可重现示例:我们有一个data.frame
时间delay
(以秒为单位);然后我们循环遍历delay
时间并将系统挂起尽可能多的秒Sys.sleep
。
如果执行时间超过 2 秒,我们withTimeout
会跳过一个步骤。
# Delay times from 1 to 10 seconds in 1 second steps
df <- data.frame(delay = seq(1:10))
library(R.utils)
lst <- lapply(1:nrow(df), function(i) {
cat(sprintf("Processing row %i/%i...", i, nrow(df)))
tryCatch(
withTimeout( {
Sys.sleep(df$delay[i]);
cat("[Done]\n") },
timeout = 2),
TimeoutException = function(ex) cat("[Skipped due to timeout]\n"))
})
#Processing row 1/10...[Done]
#Processing row 2/10...[Skipped due to timeout]
#Processing row 3/10...[Skipped due to timeout]
#Processing row 4/10...[Skipped due to timeout]
#Processing row 5/10...[Skipped due to timeout]
#Processing row 6/10...[Skipped due to timeout]
#Processing row 7/10...[Skipped due to timeout]
#Processing row 8/10...[Skipped due to timeout]
#Processing row 9/10...[Skipped due to timeout]
#Processing row 10/10...[Skipped due to timeout]
请注意我们如何withTimeout
在内部包裹以捕获(默认)超时错误,并在不终止循环tryCatch
的情况下打印自定义错误消息。lapply
推荐阅读
- c# - 为什么 System.Data.SqlClient.SqlDataAdapter 没有 FillAsync 方法?
- javascript - 即使打开了wifi,Socket.io也无法在移动浏览器上连接
- python - 尝试访问设备 ID Alexa 时出现属性错误
- php - PHP函数中未定义的变量?
- ios - 如何在向新视图控制器展示/转接时避免内存泄漏
- r - 我可以在 R` 中为 sqlite 使用 FTS 扩展吗?
- python - python 3 TypeError:'int'对象不可调用
- php - 如何显示选择计数的最后一行而不是第一行?
- list - Ansible - 循环动态生成的列表项
- mongodb - 将使用 Active Record 的 Rails 应用程序迁移到 MongoDB