1. ホーム
  2. r

[解決済み] for-loopのスキップエラー

2022-12-18 03:30:59

質問

6000×180の行列(1列につき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に関する多くの投稿を見つけましたが、どれも私にはうまくいきませんでした(少なくとも私はその機能を正しく適用することができませんでした)。ヘルプファイルもあまり役に立ちませんでした。

助けていただけるとありがたいです。ありがとうございます。

どのように解決するのですか?

ひとつの(汚い)方法としては 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

EDIT : ということで、適用するには 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")})
}