5

現在、R には約 2000 回ループするスクリプト (ループ) があり、ループごとに、URL リンクとデータを変数に入れる関数をfor使用してデータベースからデータをクエリします。read.csv

私の問題は、少量のデータ (約 10000 行) をクエリすると、ループごとに約 12 秒かかることです。しかし、今ではループごとに約 50000 行のデータをクエリする必要があり、クエリ時間はループごとに 50 秒程度にかなり増加します。そして、これは私にとっては問題ありませんが、サーバーがデータを送信するのに時間がかかり(約75〜90秒)、明らかに接続がタイムアウトし、次のエラーが発生することに気付くことがあります。

ファイルのエラー (file, "rt") : 接続を開くことができません

さらに: 警告メッセージ:

ファイル (ファイル、"rt") 内: 開けません: HTTP ステータスは '0 (nil)' でした

またはこれ:

ファイルのエラー (file, "rt") : 接続を開くことができません

さらに: 警告メッセージ:

In file(file, "rt") : InternetOpenUrl が失敗しました:「操作がタイムアウトしました」

毎回同じ警告が表示されるわけではありません。これら 2 つの間で変化します。

今、私が望むのは、これが発生したときにプログラムが停止するのを避けるか、単にこのタイムアウトエラーを防ぎ、R にデータを待つように指示することです。可能な解決策として、スクリプトの開始時にこれらの設定を試しましたが、引き続き発生します。

options(timeout=190)
setInternet2(use=NA)
setInternet2(use=FALSE)
setInternet2(use=NA)

他の提案や回避策はありますか? これが発生したときに次のループにスキップし、このエラーが発生した回数のループ番号を変数に格納して、最後に再度クエリできるようにすることができますがi、接続エラーのためにスキップされたループ内のものに対してのみです? もちろん、理想的な解決策は、このエラーを回避することです。

4

3 に答える 3

0

これは私が示す部分的なコードですが、必要に応じて変更できます。

        # connect to website
        withRestarts(
            tryCatch(
                webpage <- getURL(url_vect[i]),
                finally = print(" Succes.")
            ), 
            abort = function(){},
            error = function(e) {
                       i<-i+1
            }
        )

私の場合、url_vect[i]は、コピーした URL の 1 つでした。これにより、プログラムが悲しいことに終了するのを待つ必要がある時間が長くなります.

更新しました

tryCatch の例

于 2013-10-09T09:30:28.680 に答える