首页 > 解决方案 > 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")      
})

标签: rlapply

解决方案


你已经得到withTimeouttryCatch翻转。

这是一个基于以下简单函数的最小可重现示例:我们有一个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


推荐阅读