我在哪里为 R 包中的测试指定随机种子?

rob*_*ust 4 r devtools testthat r-package

我正在testthat为我的 R 包编写测试。我的一项测试使用jitter. 我想确保测试是可重复的。

我放 set.seed(1014)

  1. 之前或之后library(testthat)./tests/testthat.R; 或者
  2. 在每个测试文件的顶部(之前或之后context("Test./tests/testthat/test-function.R;或者
  3. 在每个单元测试的顶部(在test_that("Example works"){jitter(1)}))in ./tests/testthat/test-function.R?

为什么?

MrF*_*ick 5

如果你只声明set.seed()一次,那么你总是需要以相同的顺序运行使用随机性的测试以获得相同的结果。但是,单元测试仅在按特定顺序运行时才起作用可能不是一个好主意。您应该将种子设置为接近验证返回随机值所需的时间。

这是一个可以为代码块设置种子的函数

with_seed <- function(seed, code) {
  code <- substitute(code)
  orig.seed <- .Random.seed
  on.exit(.Random.seed <<- orig.seed)
  set.seed(seed)
  eval.parent(code)
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样运行它

with_seed(5, rnorm(5))
Run Code Online (Sandbox Code Playgroud)

或者

with_seed(5, {
  a <- rnorm(5)
  b <- runif(5)
  a + b
})
Run Code Online (Sandbox Code Playgroud)

但是您仍然会获得块外原始种子的随机数。

如果您希望从现有包中提取这样的函数,withr::set_seed似乎可以做同样的事情。

  • 您可以将其添加为辅助函数:/sf/ask/2515921061/ (2认同)