3

構文エラーをカウントし、プログラムの実行後に構文エラーの数を報告するコードを使用します。エラーカウントコードは、私の以前の質問に答えてstackoverflowで提供されました:R:エラーが発生したかどうかを示すファイルの終わりのコマンドはありますか?

大規模なデータセットを分析するときに、印刷メッセージをコメントアウトするのを忘れることがあり、Rはすべてのデータとすべてのコードを印刷できません。

 [ reached getOption("max.print") -- omitted 498 rows ] 

それが発生し、エラーカウントコードがエラーを報告した場合、単に上にスクロールしてエラーが何であるかを確認することはできません。Rコードの実行後にエラーを見つける方法はありますか?使ってみtraceback()ましたが、効果がありませんでした。私は一度も使用traceback()したことがなく、正しく使用しなかった可能性があります。私がオンラインで見つけた他の潜在的な解決策は、Rファイルを実行する前にコードを挿入する必要があるようです。

printコマンドをコメントアウトしてRコードを再実行することもできますが、この場合、コードの実行には数時間かかります。おそらく、より小さなデータセットを使用してコードをすばやく再実行してエラーを見つけることができますが、それはデータセットのサイズが何らかの理由でエラーを引き起こしていないことを前提としています。

エラーを含むサンプルプログラムを次に示します。が大きな数値(おそらく10000000)に変更された場合n、このコードは同じシナリオまたは上記で説明したものと同様のシナリオを作成するように見えます。アドバイスありがとうございます。

私は通常、コードを* .rファイルに保存し、そのファイルの内容をコピーして、Rアプリケーションのインストール中にDellPC64ビットWindows7Professionalデスクトップに配置されたデフォルトのRGUIに貼り付けることでコードを実行します。

# the four lines below are for counting syntax errors

.error.count <- 0
old.error.fun <- getOption("error")
new.error.fun <- quote(.error.count <- .error.count + 1)
options(error = new.error.fun, width=2400)

##########################################################

n <- 10

a <- rnorm(n,10,4)
b <- rnorm(n,50,8)
c <- EXP(b)
d <- a + b

df <- data.frame(a,b,d)
df

##########################################################

# the three lines below count the number of errors in the code above

cat("ERROR COUNT:", .error.count, "\n")
options(error = old.error.fun)
rm(.error.count, old.error.fun, new.error.fun)

##########################################################

traceback()

# No traceback available
4

2 に答える 2

1

local関数を使用して、ログを含むエラー ロガーを作成する、少し異なるアプローチを次に示します。

error.logger <- local({
    error.log <- list() # initial empty log
    function () {
        # each time called, add to the log
        error.log <<- c(error.log, geterrmessage()) 
    }
})

options(error=error.logger, show.error.locations=TRUE)

これは基本的に Andrie のアプローチと同じですが、グローバル変数を避けています.error.log。でログにアクセスできますget('error.log', environment(error.logger))show.error.locations=TRUEエラーメッセージにソース行番号が含まれます。

これは、インタラクティブ モードでもバッチ モードでも機能します。

于 2013-01-08T15:58:06.883 に答える
1

インタラクティブ モードでのみ機能するオプションの 1 つは、AFAICT です。

プリアンブルを変更して、エラー メッセージをエラー ログ変数に書き込みます。

.error.log <- NULL
old.error.fun <- getOption("error")

new.error.fun <- quote({
  .error.count <- .error.count + 1
  .error.log <- c(.error.log, geterrmessage())
})

次に、コードとcat()エラー ログの値を実行します。

cat("ERROR COUNT:", .error.count, "\n")
cat("ERROR LOG:", .error.log, collapse="\n")

結果:

> cat("ERROR COUNT:", .error.count, "\n")
ERROR COUNT: 1 
> cat("ERROR LOG:", .error.log, collapse="\n")
ERROR LOG: Error: could not find function "EXP"
于 2013-01-08T15:04:36.227 に答える