4

典型的なRエラーメッセージにこだわると、それらは非常に便利です。

それにもかかわらず、私はしばしばR自身のエラーメッセージが私が期待するほど有益ではないことに気付くので、私は通常、ある種のカスタマイズされたエラーメッセージを書くことになります。

ここで、特定のエラーへの追加情報だけでなく、一意のエラーコードの割り当てに関して、これに対して体系的なアプローチ(または推奨されるベストプラクティスアプローチ)があるかどうか疑問に思います。

エラーごとに追加情報を保存および取得できる、エラー用のある種のハッシュテーブルソリューションを構築したいと思います。ある種の「軽い」DBソリューション(SQLiteなど)を使用しますか、それともどこかに保存され()、必要に応じて取得される単純なオブジェクトdata.frameまたはオブジェクトを介してこれを解決しますか?list.rdata

宿題

正直なところ、私はまだそれほど多くの研究をしていません。ここに少なくとも何かがありますが;-)

パッケージレポーター

レポーターパッケージについて知りました。詳細を確認します。誰かがそのパッケージまたは同様のパッケージの経験をまだ持っていますか?

私自身のアプローチの概要(一部疑似コード)

myFoo <- function(x, ...) {
    tryCatch(
        x * 100,
        error=function(e) {
            record <- retrieveErrorRecord(e) # Does not exist yet
            # 'record' would be some sort of list or Ref Class Object

            if (!length(record)) {
                uid <- generateUid(e) # Does not exist yet
                msg <- paste(
                    "expecting arg 'x' to be of class 'numeric' (was '", 
                    class(x), "')", sep="")
                insertErrorRecord( # Does not exist yet
                    list(
                        uid=uid, 
                        message=msg, 
                        original=e
                    )
                )
                record <- retrieveErrorRecord(e)
            } 
            msg <- c(
                "myFoo/error:\n",
                paste("* Code:     ", record$uid, "\n", sep=""),
                paste("* Message:  ", record$message, "\n", sep=""),
                paste("* Original: ", record$original, "\n", sep="")  
            )
            stop(msg)            
        }
    )
}

メッセージは次のようになります

require("digest")
x <- "abc"
e <- simpleError("test error")
record <- list(
    uid=digest(e),
    message=paste("expecting arg 'x' to be of class 'numeric' (was '", 
        class(x), "')", sep=""),
    original=e
)
msg <- c(
    "myFoo/error:\n",
    paste("* Code:     ", record$uid, "\n", sep=""),
    paste("* Message:  ", record$message, "\n", sep=""),
    paste("* Original: ", record$original, "\n", sep="")  
)
> stop(msg)
Error: myFoo/error:
* Code:     e78e73054b93d2bf682df32845cd064d
* Message:  expecting arg 'x' to be of class 'numeric' (was 'character')
* Original: Error: test error
4

1 に答える 1

1

私見の1つの方法は、現在のRエラーメッセージをニーズに合ったものに「変換」することです。これは、(現在ダウンしていますか?) http://translation.r-project.org/pootleページで簡単に実行できます。そして、それは多くの作業/時間を必要とします...

しかし、標準のRエラー/警告メッセージは、実際には技術的ではありますが、非常に単純だと思います。:)

しかし、これをどのように行うことができるかについての答え/ヒントを与えるために(いくつかを使用してregexp)、ここで参照する価値のある同様のeval.msgs関数を実装しました(これは、そこで呼び出されるより堅牢な関数のヘルパーですevals)。

この関数はのように機能するため、指定されたRコマンドを評価して、返された生のRオブジェクトに加えevaluate、考えられる情報/警告/エラーをキャッチしようとします。そこで、メッセージが1行でかなり不完全であることに気付いたので、上記に適用すると、以下の例になります。messagesstdout syntax errorregexp

> x <- 'foobar'
> eval.msgs('x 100')
$src
[1] "x 100"

$result
NULL

$output
NULL

$type
[1] "error"

$msg
$msg$messages
NULL

$msg$warnings
NULL

$msg$errors
[1] "Unexpected numeric constant at character 3 in line 1: ` x 100`"


$stdout
NULL

> eval.msgs('x foo')
$src
[1] "x foo"

$result
NULL

$output
NULL

$type
[1] "error"

$msg
$msg$messages
NULL

$msg$warnings
NULL

$msg$errors
[1] "Unexpected symbol at character 3 in line 1: ` x foo`"


$stdout
NULL

> eval.msgs('x*100')
$src
[1] "x*100"

$result
NULL

$output
NULL

$type
[1] "error"

$msg
$msg$messages
NULL

$msg$warnings
NULL

$msg$errors
[1] "non-numeric argument to binary operator"


$stdout
NULL
于 2012-06-18T10:22:41.313 に答える