有多种选择,具体取决于您的具体需求。我怀疑第一个选项,最简单的还不够,但我的第二个和第三个选项可能更合适,第三个选项最自动化。
选项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