【问题标题】:How do I catch errors in a for loop in R?如何在 R 的 for 循环中捕获错误?
【发布时间】:2015-07-10 17:40:10
【问题描述】:

我正在 R 中运行一个大的 for 循环(不幸的是)。有很多随机错误不断出现。是否有一个通用代码可以放入 for 循环中,以便在发生任何类型的错误时跳到下一次迭代?谢谢。如果您向我提供可以复制和粘贴的代码,我将不胜感激,因为这超出了我的想象。

【问题讨论】:

    标签: r error-handling try-catch


    【解决方案1】:
    loop.vals <- 1:6
    success <- logical(length(loop.vals))
    for(i in loop.vals) 
     if(
       !inherits(
         try({
           if(i %% 2) stop("Random Error")
           cat("Success", i, "\n")
         }, silent=TRUE),  # as per RHertel
         "try-error"
       ) ) success[[i]] <- TRUE
    

    生产:

    Success 2 
    Success 4 
    Success 6 
    

    然后

    cat("Failures: ", which(!success))
    # Failures:  1 3 5
    

    旧答案

    当然,您可以只try 整个循环的内容。这里我们用一个循环来说明,每个奇数都失败

    for(i in 1:6) try({
      if(i %% 2) stop("Random Error")
      cat("Success", i, "\n")
    })
    

    生产:

    Error in try({ : Random Error
    Success 2 
    Error in try({ : Random Error
    Success 4 
    Error in try({ : Random Error
    Success 6 
    

    【讨论】:

    • 您也可以选择不打印错误消息并通过try( (..whatever may cause trouble...), silent=TRUE)继续循环
    • 谢谢。你知道我如何跟踪哪些迭代被跳过了吗?
    • 再次感谢。还有一个问题,在某些迭代中,我收到以下警告:Warning message: In sqrt(diag(se)) : NaNs produced 有没有办法让它跳过产生此警告(或一般警告)的迭代以及错误?谢谢。
    • 最简单(但最具侵入性的方式)是运行options(warn=2);这会将警告变成错误,然后按照您的意愿工作。完成后请记住将其关闭 (options(warn=0))。否则你可以使用tryCatch,但我不会在这里讨论。
    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 2015-11-20
    • 2019-09-08
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2018-05-08
    相关资源
    最近更新 更多