[Rd] Best way to reset random seed when using set.seed() in a function?

Henrik Bengtsson hb at stat.berkeley.edu
Wed Feb 13 17:57:23 CET 2008


Hi,

this is related to a question just raised on Bioconductor where one
function sets the random seed internally but never resets it, which
results in enforced down streams random samples being deterministic.

What is the best way to reset the random seed when you use set.seed()
within a function?  Is it still to re-assign '.Random.seed' in the
global environment as following example illustrates?  I'm not too kind
of having function modifying the global environment, if not really
necessary.

foo <- function(n) {
  # Pop random seed
  if (!exists(".Random.seed", mode="numeric"))
    sample(NA);
  oldSeed <- .Random.seed;

  # Fixed seed to get reproducible samples here
  set.seed(0xbeef);
  x <- sample(5);

  # Proof of concept: 'x' should be the same all the time
  stopifnot(identical( x, as.integer(c(4,2,5,1,3)) ));

  # Push random seed to old state
  assign(".Random.seed", oldSeed, envir=globalenv())

  # Continue as nothing happened
  sample(n);
}

> foo(5)
[1] 4 2 3 5 1
> foo(5)
[1] 4 2 3 1 5
> foo(5)
[1] 5 3 1 4 2
> foo(5)
[1] 5 3 2 4 1
> foo(5)

Is this the way to do it?

Thanks

Henrik



More information about the R-devel mailing list