3

式を評価する関数を作成しようとしていますが、その式の結果が「有限」でない場合 (is.finite で定義)、デフォルト値を返します。エラーがスローされた場合でも、関数はデフォルト値を返す必要があります。関数もベクトル化する必要があります。

これは非常に簡単なはずですが、R のエラー トラップ機能を完全には理解していません。これらのテストケースを満たすために、誰かがこの機能を改善/簡素化するのを助けることができますか?

これが私が持っている機能の始まりです。うまくいくとしても、それはかなり醜いです。

getOrElse <- function (expr, default = 0) {

    # protect against any errors
    val <- tryCatch (expr, error = function (e) {})

    # replace any non-finite values
    val [!is.finite(val)] <- default

    # this is really ugly
    if (length(val) > 1 && !is.finite(val)) val <- default

    return (val)
}

そして、ここに「テストケース」があります...

getOrElse (sqrt(4), default = 10) == 2 # WORKS

getOrElse (stop ("ignore"), default = 10) == 10  # BROKEN

getOrElse (sqrt(c(4, 16, NA, NaN)), default = 0) == c(2, 4, 0, 0) # BROKEN

getOrElse (sqrt(c(4, 16)), default = 0) == c(2, 4)  # WORKS

getOrElse (c(NA, NA), default = 10) == c(10, 10)  # WORKS

どうもありがとう

4

1 に答える 1

3

エラーが発生した場合、実際には何もしていないため、次の変更を検討してください。

getOrElse <- function (expr, default = 0) {
    stopifnot(length(default) == 1)
    val <- tryCatch (expr, error = function (e) {})
    if( length(val) ){
         val [!is.finite(val)] <- default
      } else { 
         val <- default}

    return (val)
}

それでもテストに失敗しますが、それはそうではないgetOrElse (sqrt(c(4, 16, NA, Nan)), default = 0) == c(2, 4, 0, 0)ためであり、上記のコードは「デフォルト」値で長さ1を返します。代わりにそれを使用したテストを使用すると、成功します。関数の各引数に個別に適用された式で関数を返す必要がある場合は、より複雑な逆解析を行う必要があります。NanNaNgetOrElse (sqrt(c(4, 16, NA, NaN)), default = 0) == c(2, 4, 0, 0)

于 2013-11-08T18:14:03.487 に答える