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

时间:2019-05-17 18:33:38

标签: r devtools r-package testthat

我正在使用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)}))./tests/testthat/test-function.R的内部?

为什么?

1 个答案:

答案 0 :(得分:3)

如果只声明一次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)
}

您可以像这样运行它

with_seed(5, rnorm(5))

with_seed(5, {
  a <- rnorm(5)
  b <- runif(5)
  a + b
})

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

如果您希望从现有软件包中提取此类功能,则withr::set_seed似乎可以完成同样的事情。