Где мне указать случайное начальное число для тестов в пакете R? - PullRequest
3 голосов
/ 17 мая 2019

Я использую 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 Ответ

3 голосов
/ 17 мая 2019

Если вы объявляете 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 , кажется, делает то же самое.

...