2011-08-11 7 views
4

なぜRは "値[3L]のエラー:ブレーク/ネクストに対してループなし、最上位にジャンプする"というエラーをスローしますループの反復?私はこの問題は、プロットが失敗したときに、私は別の画像またはまったくイメージを作りたかったので、思いついたRバージョン2.13.1(2011-07-08)Rがブレーク/ネクストにループがないとトップレベルにジャンプします

for (i in seq(10)) { 
    tryCatch(stop(), finally=print('whoops'), error=function(e) next) 
} 

上です。 joranのアプローチを使用したコードは、次のようになります。

for (i in c(1,2,Inf)) { 
    fname = paste(sep='', 'f', i, '.png') 
    png(fname, width=1024, height=768) 
    rs <- tryCatch(plot(i), error=function(e) NULL) 
    if (is.null(rs)){ 
    print("I'll create a different picture because of the error.") 
    } 
    else{ 
    print(paste('image', fname, 'created')) 
    dev.off() 
    next 
    } 
} 

答えて

4

を残念ながら、あなたは、もはやループにいるあなたのerror関数の内部で得れば。これをハッキングできる方法があります:

for (i in seq(10)) { 
    delayedAssign("do.next", {next}) 
    tryCatch(stop(), finally=print('whoops'), 
     error=function(e) force(do.next)) 
} 

これは...でも、ハッキーです。おそらく、ハッキーな方法はありませんが、私はすぐには見えません。

delayedAssignforceの努力を打ち消す、すべてのループを起こるので、これは動作します)

EDIT

それとも継続を使用することもできますヨリス・ポイントとして

for (i in seq(10)) { 
    callCC(function(do.next) { 
     tryCatch(stop(), finally=print('whoops'), 
      error=function(e) do.next(NULL)) 
     # Rest of loop goes here 
     print("Rest of loop") 
    }) 
} 

EDIT

実際にこれらのいずれかを使用するべきではありません。なぜなら、彼らは読みにくいからです。しかし、あなたが実際にループの中でnextに電話したいなら、これは方法です:)。

+0

をええ、どちらも私のために働くように見えます。しかし、私はこのコードがplotコマンドが失敗した場合にpngを作成しないと言いませんでした。たぶん私はそれを間違って設定したでしょう。プロットは停止がどこに行くか。 – selden

+0

+1良い説明ですが、私はあなたの構成に対して強くアドバイスします。ハッキングすることなく同じ結果を生み出すことができるはるかに優れたプログラミングフローがあります。あなたがやりたいことを内部関数に置き、tryCatchなどでラップします。 –

+0

@Jorisはい、あなたは本当に正しいです。私はちょうど関数内から 'next'を呼び出すという考えに興味を持っていました。私は狂気のために謝罪するメモを追加します;) – Owen

1

nexttryCatchの外側に貼ると意味がありませんでしたか?ifチェックに基づいていますか?このような何か:

for (i in c(1,2,Inf)) { 
    rs <- tryCatch(seq(i), finally=print('whoops'), error=function(e) NULL) 
    if (is.null(rs)){ 
    print("I found an error!") 
    } 
    else{ 
    next 
    } 
} 

私は私はあなたが何をしようとして上で少しは不明だので、これは、あなたが望むものであるか分からないが。 OPの改正に基づき

EDIT

、この製剤は、私の作品:

plotFn <- function(fname,i){ 
    png(fname, width=400, height=200) 
    plot(i) 
    dev.off() 
} 


for (i in c(1,Inf,3)) { 
    fname = paste('f', i, '.png',sep="") 
    rs <- tryCatch(plotFn(fname,i), error=function(e){dev.off(); return(NULL)}) 
    if (is.null(rs)){ 
    print("I'll create a different picture because of the error.") 
    } 
    else{ 
    print(paste('image', fname, 'created')) 
    next 
    } 
} 

私が修正されるために必要なエラーが発生した場合にdev.off()コールを持っていないことを確信しています。 pngplotを分けることが問題を引き起こす原因を正確に理解するためには、少し深く掘り下げなければならないでしょう。しかし、私はおそらくpng(); plot(); dev.off()シーケンスをとにかく自己完結した状態に保つのがよりクリーンだと思う。また、私はdev.off()をエラー関数に入れています。

plotFnpng()にエラーをスローした場合の動作はテストされていません。デバイスを作成せずにエラー機能に到達し、dev.off()を呼び出します。行動は、Rセッションで他に何が起こっているかによって異なる場合があります。

+0

私はあなたのコードを使って私がしようとしていることを行う質問を編集しました。毎回プロットがエラーをスローするので、それがうまく動作しないことに注意してください。 – selden

4

たぶん、あなたは試みることができる:

for (i in seq(10)) { 
    flag <- TRUE 
    tryCatch(stop(), finally=print('whoops'), error=function(e) flag<<-FALSE) 
    if (!flag) next 
} 
関連する問題