for循环中的跳过错误
Posted
技术标签:
【中文标题】for循环中的跳过错误【英文标题】:Skipping error in for-loop 【发布时间】:2013-01-22 19:14:09 【问题描述】:我正在执行一个 for 循环,为我的 6000 X 180 矩阵(每列 1 个图)生成 180 个图,一些数据不符合我的标准,我收到错误:
"Error in cut.default(x, breaks = bigbreak, include.lowest = T)
'breaks' are not unique".
我对这个错误很好,我希望程序继续运行 for 循环,并给我一个导致此错误的列的列表(可能作为包含列名的变量?)。
这是我的命令:
for (v in 2:180)
mypath=file.path("C:", "file1", (paste("graph",names(mydata[columnname]), ".pdf", sep="-")))
pdf(file=mypath)
mytitle = paste("anything")
myplotfunction(mydata[,columnnumber]) ## this function is defined previously in the program
dev.off()
注意:我发现了很多关于 tryCatch 的帖子,但没有一个对我有用(或者至少我无法正确应用该功能)。帮助文件也不是很有帮助。
我们将不胜感激。谢谢。
【问题讨论】:
花点时间思考一下您的问题。我们是否需要了解向量mypath
或您正在保存 pdf 的事实?
好的,所以你需要使用tryCatch“练习”。这真的没那么难。组成一些简单的循环函数并提供错误的数据。然后应用到你当前的循环,它毕竟包含一组非常简单的命令。
我肯定需要,现在我知道它是如何工作的,我可以玩弄它。 :)
【参考方案1】:
一种(肮脏的)方法是使用带有空函数的tryCatch
进行错误处理。例如,以下代码引发错误并中断循环:
for (i in 1:10)
print(i)
if (i==7) stop("Urgh, the iphone is in the blender !")
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
Erreur : Urgh, the iphone is in the blender !
但是您可以将您的指令包装到 tryCatch
中,并使用一个不执行任何操作的错误处理函数,例如:
for (i in 1:10)
tryCatch(
print(i)
if (i==7) stop("Urgh, the iphone is in the blender !")
, error=function(e))
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
但我认为您至少应该打印错误消息以了解在让您的代码继续运行时是否发生了坏事:
for (i in 1:10)
tryCatch(
print(i)
if (i==7) stop("Urgh, the iphone is in the blender !")
, error=function(e)cat("ERROR :",conditionMessage(e), "\n"))
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
ERROR : Urgh, the iphone is in the blender !
[1] 8
[1] 9
[1] 10
编辑:因此,在您的情况下应用 tryCatch
类似于:
for (v in 2:180)
tryCatch(
mypath=file.path("C:", "file1", (paste("graph",names(mydata[columnname]), ".pdf", sep="-")))
pdf(file=mypath)
mytitle = paste("anything")
myplotfunction(mydata[,columnnumber]) ## this function is defined previously in the program
dev.off()
, error=function(e)cat("ERROR :",conditionMessage(e), "\n"))
【讨论】:
谢谢你的回答朱巴,你写的命令很清楚。但我仍然有两个问题。 1-可悲的是,程序在第 26 列停止并告诉我“错误:呃,iphone 在搅拌机中”(所以你的程序部分工作!)。 2- 在您的命令中,错误总是发生在 i==7,但我可能在 26,50,70,120,121,135 处有错误...。有没有办法说“只要有错误,就跳到下一个 if”。赞赏tryCatch
指令应该“拦截”代码或数据中出现的错误...
嗯,我相信你所说的 Juba,你的命令非常好。但这就是发生的事情(请看帖子的结尾)。你能想到哪里出了问题吗?
不,你不明白tryCatch
的工作原理。请参阅我编辑的答案,了解您可以在代码中使用它的方式(显然未经测试)。但 Daniel Fischer 的答案可能是最好的:您应该真正尝试了解错误是什么并在您的函数中处理它。
我刚刚在我的家庭作业中实现了这一点,由于采样错误,我的代码失败了 3/4 次,但这让我继续前进。【参考方案2】:
这是一个简单的方法
for (i in 1:10)
skip_to_next <- FALSE
# Note that print(b) fails since b doesn't exist
tryCatch(print(b), error = function(e) skip_to_next <<- TRUE)
if(skip_to_next) next
请注意,循环完成了所有 10 次迭代,尽管有错误。您显然可以用您想要的任何代码替换print(b)
。如果tryCatch
中包含多行代码,您还可以在 和
中包含多行代码
【讨论】:
【参考方案3】:如果会发生错误(即如果中断是唯一的),是否可以先在 myplotfunction()
函数中或之前进行测试,而不是捕获错误,并且只在那些不会发生错误的情况下绘制它'没出现?!
【讨论】:
程序在循环 26 处停止运行,这就是为什么我不知道哪些列会再次出现此问题。以上是关于for循环中的跳过错误的主要内容,如果未能解决你的问题,请参考以下文章
19 C#循环语句的跳过和中断 continue和break