【问题标题】:Where do I specify random seed for tests in R package?我在哪里为 R 包中的测试指定随机种子?
【发布时间】:2019-10-05 02:35:04
【问题描述】:

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

我要不要输入set.seed(1014)

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

为什么?

【问题讨论】:

  • 好吧,如果您不希望您的测试依赖于它们的运行顺序,您应该将种子设置为接近您将要选择随机数的位置。所以我建议把它放在单元测试本身中。

标签: r devtools r-package testthat


【解决方案1】:

如果您只声明一次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 似乎可以做同样的事情。

【讨论】:

猜你喜欢
  • 2019-03-15
  • 2011-05-23
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
相关资源
最近更新 更多