Есть несколько вариантов, в зависимости от ваших конкретных потребностей. Я подозреваю, что первого варианта недостаточно, но мои второй и третий варианты могут быть более подходящими, а третий вариант наиболее автоматизирован.
Опция 1
Если вы заранее знаете, что функция, использующая / создающая случайные числа, всегда будет отображать одно и то же число, и вы не переупорядочиваете вызовы функций и не вставляете новый вызов между существующими, тогда все, что вам нужно сделать, это установить начальное число один раз. В самом деле, вы, вероятно, не захотите постоянно сбрасывать начальное значение, поскольку вы просто продолжаете получать один и тот же набор случайных чисел для каждого вызова функции.
Например:
> set.seed(1)
> sample(10)
[1] 3 4 5 7 2 8 9 6 10 1
> sample(10)
[1] 3 2 6 10 5 7 8 4 1 9
>
> ## second time round
> set.seed(1)
> sample(10)
[1] 3 4 5 7 2 8 9 6 10 1
> sample(10)
[1] 3 2 6 10 5 7 8 4 1 9
Вариант 2
Если вы действительно хотите убедиться, что функция использует одно и то же семя, и вы хотите установить его только один раз, передайте семя в качестве аргумента:
foo <- function(...., seed) {
## set the seed
if (!missing(seed))
set.seed(seed)
## do other stuff
....
}
my.seed <- 42
bar <- foo(...., seed = my.seed)
fbar <- foo(...., seed = my.seed)
(где ....
означает другие аргументы вашей функции; это псевдокод).
Вариант 3
Если вы хотите автоматизировать это еще больше, вы можете злоупотребить механизмом options
, что нормально, если вы просто делаете это в сценарии (для пакета вы должны использовать свой собственный объект параметров). Тогда ваша функция может искать эту опцию. Например.
foo <- function() {
if (!is.null(seed <- getOption("myseed")))
set.seed(seed)
sample(10)
}
Тогда в употреблении имеем:
> getOption("myseed")
NULL
> foo()
[1] 1 2 9 4 8 7 10 6 3 5
> foo()
[1] 6 2 3 5 7 8 1 4 10 9
> options(myseed = 42)
> foo()
[1] 10 9 3 6 4 8 5 1 2 7
> foo()
[1] 10 9 3 6 4 8 5 1 2 7
> foo()
[1] 10 9 3 6 4 8 5 1 2 7
> foo()
[1] 10 9 3 6 4 8 5 1 2 7
person
Gavin Simpson
schedule
17.12.2013