我的问题与here描述的问题非常相似,但遗憾的是我无法在我所处的特定情况下应用代码。
所以我试图下载很多网址,我正在使用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
}
所以这就是我想要做的事情:
每当我的for循环命中“Error:Try Again”时,我希望循环再次尝试直到它起作用。
每当我的for循环命中“Error:Stop for loop”时,我希望循环停止,这样我就可以手动修复API密钥错误。在这种情况下,我希望保存循环的结果,所以我可以在以后重新启动循环时将它们组合在一起。
不幸的是,我在写这些条件方面非常不熟练。我知道我必须以某种方式使用try
或tryCatch
,但我无法弄清楚如何测试特定的错误消息(而不是在发生错误时)。
感谢大家的帮助!
答案 0 :(得分:1)
我觉得这样的事情很好。我将错误生成部分拉到了自己的函数中,使事情变得更模块化,更容易理解。
为了轻松&#34;尝试直到成功,#{1}}循环比while
循环更有意义。我们可以for
停止循环。我已经使用break
跳转到循环的下一个迭代,虽然这里真的不需要它(使用它会跳过当前迭代循环中剩下的所有东西 - 但是因为那里&# 39;在next
陈述之后,他们可能被遗漏了,真的没有发生任何事情。
next