8

我正在为 R 开发 PKNCA 包。在开发测试代码时,一些测试也是很好的例子。我想同时保留它们(测试和示例)。有没有办法可以在 roxygen2 文档中嵌入一些东西,这些东西也会被复制到测试中?

我正在考虑的是文档,例如:

#' @exampleTest
#' set.seed(5)
#' rnorm(1) ## -0.8409

这将产生一个测试,如:

expect_equal({set.seed(5)
              rnorm(1)}, -0.8409, tol=1e-4)

(tol 来自于它是一个数字和示例中显示的位数的事实。)

4

2 回答 2

5

按照Hadley Wickham 的关于包的书的检查章节中的devtools::run_examples()说明使用。运行 R CMD CHECK 时会测试函数示例。这不是 testthat 的一部分,而是标准 R 包检查系统的一部分。

于 2015-12-04T08:20:13.907 回答
1

有一种方法,但它并不像你想要的那样顺利。您必须在块testthat内调用函数。@examples这是一个示例函数:

#' @examples
#'   testStrings <- c("1234567890",
#'                    "123 456 7890")
#'
#'   testthat::expect_equal(extractPhoneNumbers(testStrings), "0123")
extractPhoneNumbers <- function(inputStr) {
    # check input:
    if (!is.character(inputStr)) {
        stop("'inputStr' must be a (vector of) string(s)!")
    }

    # imports
    `%>%` <- stringr::`%>%`
    replace_all <- stringr::str_replace_all
    extract_all <- stringr::str_extract_all

    # intermediary regex's
    visualDelimitersRegex <- "[()+\\-_. ]"
    phoneNumberRegex <- "[:digit:]{10}"

    inputStr %>%
    replace_all(pattern = visualDelimitersRegex, replacement = "") %>%
    extract_all(pattern = phoneNumberRegex)
}

当你运行devtools::run_examples()ordevtools::check时,两者都会抛出错误,因为调用会testthat::expect_equal()抛出错误。

示例输出devtools::check看起来像

*** SNIP ***
* checking for unstated dependencies in examples ... OK
* checking examples ... ERROR
Running examples in ‘demoPkg-Ex.R’ failed
The error most likely occurred in:

> base::assign(".ptime", proc.time(), pos = "CheckExEnv")
> ### Name: extractPhoneNumbers
> ### Title: Extract Phone Numbers
> ### Aliases: extractPhoneNumbers
> 
> ### ** Examples
> 
>   testStrings <- c("1234567890",
+                    "123 456 7890")
> 
>   testthat::expect_equal(extractPhoneNumbers(testStrings), "0123")
Error: extractPhoneNumbers(testStrings) not equal to "0123"
Modes: list, character
Length mismatch: comparison on first 1 components
Component 1: 1 string mismatch
Execution halted
* checking for unstated dependencies in ‘tests’ ... OK
* checking tests ...
  Running ‘testthat.R’
 OK
* checking PDF version of manual ... OK
* DONE

Status: 1 ERROR
于 2016-01-27T11:52:47.687 回答