web-dev-qa-db-ja.com

forループでのエラーのスキップ

私は6000 X 180マトリックス(列ごとに1グラフ)の180グラフを生成するためにforループを実行していますが、一部のデータが基準に合わず、エラーが発生します:

"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に関する多数の投稿を見つけましたが、どれも役に立たなかった(または少なくとも機能を正しく適用できなかった)。ヘルプファイルもあまり役に立ちませんでした。

ヘルプをいただければ幸いです。ありがとう。

53
Error404

それを行う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")})
}
103
juba

エラーをキャッチする代わりに、エラーが発生するかどうか(つまり、ブレークが一意である場合)myplotfunction()関数の前または前にテストし、それができない場合にのみプロットすることはできません現れる?!

3
Daniel Fischer