for循环中的跳过错误


74

我正在做一个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的事实?
csgillespie 2013年

1
好的,因此您需要使用tryCatch进行“练习”。其实并不难。组成一些简单的循环函数并向其提供错误的数据。然后应用到当前循环,该循环毕竟包含一组非常简单的命令。
卡尔·威索夫特

我已经定义了definitley,现在我知道它是如何工作的,我可以尝试一下。:)
Error404 2013年

Answers:


144

一种(肮脏的)方法是使用 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")})
}

感谢您的回答,Juba,您编写的命令非常清楚。但是我仍然有2个问题。1-遗憾的是,程序停止在第26列,并告诉我“错误:呃,iphone在搅拌器中”(因此您的程序正在部分工作!)。2-在您的命令中,错误总是在i == 7处发生,但是我可能在26,50,70,120,121,135 ...处出现错误...。有没有办法说“只要有错误,请跳到下一个if”。赞赏
Error404 2013年

3
tryCatch指令应在代码或数据中出现时“截获”该错误……
juba

好吧,我相信您所说的朱巴,您的命令很好。但这是发生了什么(请看一下帖子的结尾)。你能想到出什么问题了吗?
Error404 2013年

2
不,您不了解其tryCatch工作原理。请参阅我编辑过的答案,以了解可以在代码中使用它的方式(显然,未经测试)。但是Daniel Fischer的答案可能是最好的:您应该真正尝试理解错误是什么,并在函数中加以处理。
juba

1
我只是在家庭作业中实现了这一点,由于采样错误,我的代码失败了3/4次,但这使我得以继续前进。
蓝鸟

3

除了捕获错误之外,还不能myplotfunction() 首先在函数中或函数之前进行测试,以确认是否会发生错误(即,如果中断是唯一的),并仅针对不会出现错误的情况进行绘制?


该程序在循环26处停止运行,这就是为什么我不知道哪些列会再次造成此麻烦的原因。
Error404 2013年

1

这是一个简单的方法

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.