我正在使用testthat
为我的R包编写测试。我的一项测试使用了jitter
。我要确保测试可重复。
我放set.seed(1014)
library(testthat)
中./tests/testthat.R
之前或之后;或context("Test
中每个测试文件的顶部(在./tests/testthat/test-function.R
之前或之后);或test_that("Example works"){jitter(1)}))
中./tests/testthat/test-function.R
的内部?为什么?
答案 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似乎可以完成同样的事情。