4

R の assertthat パッケージを使用しており、アサーションの失敗時にエラーではなく警告を (一時的に) 出力したいと考えています。assertthat パッケージでこれを行う最も簡単な方法は何ですか?

エラーの代わりに警告を求めることは、アサーションの使用目的に反することを認識しています。長期的には、アサーションの失敗時にエラーを出力したいと考えています。短期的には、不適切な入力があってもコードが機能することを望んでいます。これは、不適切な入力による出力でも今のところ「十分」であるからです。

簡単な例: x を入力として x+5 を出力する関数があるとします。x!=3 の場合に警告を出力したい。最終的には assert_that を使用するので、警告に assertthat パッケージを使用できると便利です。

長期的には、これを使用します。

> x <- 3
> fn <- function(x) {assert_that(x==3); return(x+5)}
> fn(3)
[1] 8
> fn(4)
 Error: x not equal to 3 

短期的には、これが私がこれまでに持っている最高のものです。

> fn <- function(x) {if(!see_if(x==3)) warning(validate_that(x==3)); return(x+5)}
> fn(3)
[1] 8
> fn(4)
[1] 9
Warning message:
In fn(4) : x not equal to 3

可能であれば、より簡潔な解決策を探しています (最良のケースは、「output_warning」パラメーターを assert_that に渡すことですが、それは存在しないと思います)。

4

4 に答える 4

3

実行したい式に対応する文字列を受け入れるユーザー定義関数を作成しましたvalidate_that()(最終的にはassert_that())。この関数は、アサーションが失敗した場合は警告を出力し、それ以外の場合は黙っています。使い方は下記参照。必要に応じて、このカスタム関数を簡単に拡張して、複数の式を受け入れることができます。sys.calls()このヘルパー関数を呼び出した関数の名前を取得するためにも使用していることに注意してください。これは重要な情報であり、警告を実際に生成したコードと関連付けることができます。

assert_that_soft <- function(exp) {
                        if (!exp) {
                            print (paste("Error in function:",
                                   parse(sys.calls()[[sys.nframe()-1]])) ) # name of caller
                        }
                    }

使用法:

> fn <- function(x) { assert_that_soft(x==3); return(x+5) }
> fn(3)
[1] 8
> fn(8)
[1] "Error in function: fn(8)"
[1] 13
于 2015-07-01T02:04:20.130 に答える
2

関数を上書きする最も簡単な方法は、ほとんどのassert_that関数をそのままコピーし、新しい関数を同じ名前で呼び出すことだと思います。これにより、エラー モードになったときにすべてのコードを変更する必要がなくなります。

assert_that <- function(..., env=parent.frame()) {
    res <- see_if(..., env=env)
    if (res)
        return(TRUE)
    warning(attr(res, "msg"))
    TRUE
}

fn <- function(x) { assert_that(x==3); return(x+5) }
fn(3)
# [1] 8
fn(8)
# [1] 13
# Warning message:
# In assert_that(x == 3) : x not equal to 3
于 2015-07-01T03:10:07.623 に答える
1

もう 1 つのオプションは、assert_that を tryCatch にラップすることです。

fn <- function(x) tryCatch(assert_that(x == 3), error = function(e) warning(e), finally = return(x+5))
fn(3)
# [1] 8
fn(8)
# [1] 13
# Warning message:
# x not equal to 3
于 2019-05-16T14:29:44.450 に答える