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