2012-02-28 5 views
4

複数の行の呼び出しが存在する場合、潜在的なエラーにはmatch.call()の最初の行だけが含まれ、情報が失われ、不完全な文が生成されます。簡単な例:Rの不完全なエラーメッセージをオーバーライド

#proper error message: 
runif(n=1, k=5) 

#incomplete error message: 
runif(n=1, k={5}) 

何だろうRは(多分複数行を折りたたむかそこらで)エラーメッセージへの完全なコールが含まれるように取得する方法?私はtryCatch設定でこれを使用することにほとんど興味があります。

答えて

3

私は経由tryCatch設定でエラーオブジェクトを調査に行くを持っていた:

tryCatch(runif(n=1,k={5}), 
      error = function(e) recover()) 

そしてeを調べるために、第4回環境(value[[3]](cond))を選択しました。

私はe$callだったことに気づい:

Browse[1]> e$call 
runif(n = 1, k = { 
    5 
}) 

だから、エラーメッセージがちょうどその最初の行を使用しているようです。だからあなたのようなもの試みることができる

Browse[1]> paste(deparse(e$call),collapse='') 
[1] "runif(n = 1, k = { 5})" 

tryCatch(runif(n=1,k={5}), 
      error = function(e) { 
      cat(sprintf('Error in %s: %s\n', 
       paste(deparse(e$call),collapse=''), 
       e$message)) 
      }) 

をしかし、これはエラーメッセージ自体、単なる通話大手を修正しない

あなたは一緒にすべての行を折りたたむことができますこれまで:

runif中にエラーが発生した(n = 1、K = {5}):未使用の引数(S)(K = {

したがって、 'Error in xxx'は完了しましたが、 '未使用引数xxx'はまだありません。それは始まりですが、その途中ではありません。

これを改善する方法はわかりません(可能であれば知りたいと思っています)。

+0

内部関数geterrmessageからエラーメッセージが表示されるようです。そこに切り詰められている(それがそうであるように思われる)場合は、おそらくエラーメッセージを修正することは非常に難しいでしょう。内部関数のコードについては、https://svn.r-project.org/R/branches/R-2-14-branch/src/main/errors.cの 'do_geterrmessage'関数を参照してください。 – Aaron