6

R CMD checkR パッケージのテストを書いていますが、関数が特定の入力に対して正しい警告を表示することを確認したいと考えています。しかし、警告出力をキャプチャしてテストできるようにする方法がわかりません。

したがって、次のような関数がある場合:

throwsWarning<-function(x){
  if(x>0){
    warning('Argument "x" is greater than zero, results may be incorrect')
  }
  # do something useful ...
}

テストファイルに次のようなものが必要です。

warningOutput <-try( throwsWarning(1))
if (warningOutput!='Argument "x" is greater than zero, results may be incorrect'){
  stop('function "throwsWarning" did not produce correct warning when x>0')
}

これまでのところoptions、警告がエラーとして扱われ、trycatchブロックで囲まれるように変更することで、可能な部分的な解決策を見つけました。の値をテストすることも考えられますがlast.warning、警告がスローされない場合は危険と思われます (以前の値をテストします)。私が行方不明になっているこれを行う簡単な方法があるに違いないように思えますか?

4

2 に答える 2

6

testthatパッケージには、使用できるexpect_warningandgives_warning関数があります。

例から、次のようにします。

R> library(testthat)
R> expect_that(warning("this is a warning"), gives_warning("is a"))
## This does not raise an error, but:
R> expect_that(warning("this is a warning"), gives_warning("nope"))
Error: warning("this is a warning") does not match 'nope'. Actual value: 
this is a warning

gives_warningということで、出されるはずの警告にマッチする正規表現です。正規表現が一致しない (または警告がスローされない) 場合、赤いフラグが立てられます。

同様に、短い方を使用しexpect_warningます:

R> expect_warning(warning("this is a warning"), "is a")
于 2013-01-23T02:58:36.827 に答える
2

独自のパッケージを作成している場合は、特定の種類のエラーまたは警告をスロー (およびキャッチ) することにより、R の条件システムを利用することが理にかなっている場合があります。そう

myFun <- function(x) {
    if (any(is.na(x))) {
        w <- simpleWarning("'x' contains NA values")
        class(w) <- c("HasNA", class(w))
        warning(w)
    }
    if (any(x < 0))
        warning("'x' contains values less than 0")
    x
}

次に、たとえば with などのテストで、テストに関心のある条件のみをlibrary(RUnit)使用tryCatchして選択します。つまり、 class の警告HasNA:

test_myFun_NAwarning <- function() {
    warnOccurred <- FALSE
    tryCatch(myFun(1:5), HasNA = function(w) warnOcccurred <<- TRUE)
    checkTrue(!warnOccurred)
    tryCatch(myFun(-(1:5)), HasNA = function(w) warnOcccurred <<- TRUE)
    checkTrue(!warnOccurred)
    tryCatch(myFun(c(1:5, NA)), HasNA = function(w) warnOccurred <<- TRUE)
    checkTrue(warnOccurred)
}

につながる

> test_myFun_NAwarning()
[1] TRUE
Warning message:
In myFun(-(1:5)) : 'x' contains values less than 0

これは、tryCatch が関心のある特定の警告だけをキャッチしていること、および文字列のテキストの一致に依存しない方法でキャッチしていることを示しています。.warnおそらく、パッケージのすべての警告を作成するヘルパー関数が必要になるでしょう。詳細については、を参照してください?withCallingHandlerswithCallingHandlersmuffleRestartは、警告が発生した後に評価を停止するのではなく、継続して評価に対処する方法tryCatchです。

于 2013-01-23T21:31:38.673 に答える