在哪里为 R 包中的测试指定随机种子?
Where do I specify random seed for tests in R package?
我正在使用 testthat
为我的 R 包编写测试。我的一项测试使用了 jitter
。我想确保测试是可重现的。
我放set.seed(1014)
- 在
./tests/testthat.R
中的library(testthat)
之前或之后;或
- 在
./tests/testthat/test-function.R
中每个测试文件的顶部(context("Test
之前或之后);或
- 在每个单元测试的顶部(在
./tests/testthat/test-function.R
中的 test_that("Example works"){jitter(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 似乎可以做同样的事情。
我正在使用 testthat
为我的 R 包编写测试。我的一项测试使用了 jitter
。我想确保测试是可重现的。
我放set.seed(1014)
- 在
./tests/testthat.R
中的library(testthat)
之前或之后;或 - 在
./tests/testthat/test-function.R
中每个测试文件的顶部(context("Test
之前或之后);或 - 在每个单元测试的顶部(在
./tests/testthat/test-function.R
中的test_that("Example works"){jitter(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 似乎可以做同样的事情。