2017-12-13 8 views
0

私の問題はhere説明されているものと非常によく似ていますが、残念ながら私は、私は午前、特定の状況でコードを適用することができません。(Rで)

だから私はしようとしています多くのURLをダウンロードするには、これを行うためにforループを使用しています。これは私のループの様子です。

ids <- c("1", "3", "7", "9") 

numbers <- list() 
    for (jj in seq_along(ids)) { 
    numbers[[jj]] <- as.numeric(ids[jj]) 
     } 

これはすべてのdandyで動作します。私がエラー"Error: Try Again"を受け取るまではランダムに表示されますが、同じ場所でループを再開するだけで修正することができます。

ただし、私が使用しているAPIキーが有効期限切れの"Error: Stop for loop"という別のエラーがあります。このエラーでは、ループを停止し、手動でAPIキーを再起動する必要があります(残念ながら自動化できません)。それが途絶えたイテレーターでもう一度始めてください。だからここ

errors <- c("Error: Try Again", "Error: Stop for loop") 

numbers <- list() 
    for (jj in seq_along(ids)) { 
    numbers[[jj]] <- as.numeric(ids[jj]) 
    if (jj == sample(1:4, 1)) stop(sample(errors, 1)) 
    #randomly stops and gives one or the other error 
    } 

は私が何をしたいです::だから

はこれをシミュレートするために、私はこの小さなループを書いた

  1. たび、私のループヒットのための「エラー:もう一度試してみてください」ループが動作するまでループを再試行します。

  2. 私のforループが "Error:Stop for loop"とヒットするたびに、ループを停止してAPIキーエラーを手動で修正できるようにします。この場合、ループの結果を保存しておきたいので、後でループを再起動すると、それらを一緒にバインドすることができます。

残念ながら、私は残念なことに、この種の条件を書いても未熟です。私はtryまたはtryCatchを何となく使用しなければならないことを知っていますが、エラーが発生した場合よりも特定のエラーメッセージをテストする方法がわかりません。

皆さんありがとうございます!

+0

私の実際のループのコードがパッケージを必要としたと私は理にかなっているという考え – FaV1

+0

を伝える簡単な再現性の例を望んでいた、もう少し慎重にあなたの質問を読んだ後、私はそれがそうだった考え出したので、それだけでイラストです。 – Gregor

答えて

1

このようなものは良いと思います。エラー生成部分をモジュール化して、モジュール化して理解しやすくする独自の関数にしました。

簡単に「成功するまで試してみよう」と言うと、whileループはforループよりも意味があります。我々はbreakループを停止することができます。私はnextを使用してループの次の反復にジャンプしましたが、実際にはここでは必要ありません(現在の反復でループ内に残っているものはすべてスキップしますが、nextステートメントの後には何も起こりません出ることはできませんでした)。

ids <- c("1", "3", "7", "9", "12", "13", "18") 

foo = function() { 
    errors <- c("Error: Try Again", "Error: Stop for loop") 
    if (runif(1) < 0.25) stop(sample(errors, 1)) 
} 

numbers <- list() 
jj = 1 
while(jj <= length(ids)) { 
    numbers[[jj]] <- as.numeric(ids[jj]) 
    outcome = tryCatch(foo(), error = function(e) e) 
    if (is.null(outcome)) { 
    jj = jj + 1 
    next 
    } else if (outcome$message == "Error: Stop for loop") { 
    message("Loop stopped on iteration ", jj) 
    break 
    } else if (outcome$message == "Error: Try Again"){ 
    next 
    } 
} 
+0

おかげで!これは私のためにやった! – FaV1