【问题标题】:for loop error handling with specific error conditions (in R)具有特定错误条件的 for 循环错误处理(在 R 中)
【发布时间】:2018-05-27 18:51:56
【问题描述】:

我的问题与here 所描述的非常相似,但不幸的是我无法在我所处的特定情况下应用代码。

所以我正在尝试下载许多 URL,并且我正在使用 for 循环来完成这项工作。这就是我的循环的样子:

ids <- c("1", "3", "7", "9")

numbers <- list()
  for (jj in seq_along(ids)) {  
   numbers[[jj]] <- as.numeric(ids[jj])
      }

这很管用。直到我收到错误"Error: Try Again",它随机出现但如果我只是在同一个地方再次启动循环就可以修复。

但是,有一个不同的错误表明我使用的 API 密钥已过期 "Error: Stop for loop",对于这个错误,我需要停止循环,手动重新启动 API 密钥(不幸的是不能自动)和然后从它停止的迭代器重新开始。

所以为了模拟这个,我写了这个小循环:

errors <- c("Error: Try Again", "Error: Stop for loop")

numbers <- list()
  for (jj in seq_along(ids)) {  
   numbers[[jj]] <- as.numeric(ids[jj])
    if (jj == sample(1:4, 1)) stop(sample(errors, 1)) 
   #randomly stops and gives one or the other error
  }

这就是我想要做的:

  1. 每当我的 for 循环遇到“错误:再试一次”时,我希望循环再试一次,直到它工作为止。

  2. 每当我的 for 循环遇到“错误:停止 for 循环”时,我希望循环停止,以便手动修复 API 密钥错误。在这种情况下,我希望保存循环的结果,以便稍后在重新启动循环时将它们绑定在一起。

不幸的是,我在编写这些条件时非常不熟练。我知道我必须以某种方式使用trytryCatch,但我无法弄清楚如何测试特定的错误消息(而不是是否发生错误)。

感谢大家的帮助!

【问题讨论】:

  • 这只是一个说明,因为我的实际循环代码需要这些包,我想要一个简单的可重现示例来传达这个想法
  • 有道理,在仔细阅读您的问题后,我认为是这样。

标签: r for-loop error-handling while-loop try-catch


【解决方案1】:

我认为这样的事情很好。我将产生错误的部分提取到它自己的函数中,以使事情更加模块化且更易于理解。

为了轻松“尝试直到成功”,while 循环比for 循环更有意义。我们可以break 来停止循环。我已经使用next 跳转到循环的下一个迭代,尽管这里确实不需要它(使用它会跳过当前迭代循环中剩下的所有内容 - 但因为在我的 @ 之后真的没有发生任何事情987654325@ 声明它们可以被省略)。

ids <- c("1", "3", "7", "9", "12", "13", "18")

foo = function() {
    errors <- c("Error: Try Again", "Error: Stop for loop")
    if (runif(1) < 0.25) stop(sample(errors, 1))
}

numbers <- list()
jj = 1
while(jj <= length(ids)) {
    numbers[[jj]] <- as.numeric(ids[jj])
  outcome = tryCatch(foo(), error = function(e) e)
  if (is.null(outcome)) {
    jj = jj + 1
    next
  } else if (outcome$message == "Error: Stop for loop") {
    message("Loop stopped on iteration ", jj)
    break
  } else if (outcome$message == "Error: Try Again"){
    next
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多