From hb at stat.berkeley.edu  Wed Feb 13 17:57:23 2008
From: hb at stat.berkeley.edu (Henrik Bengtsson)
Date: Wed, 13 Feb 2008 08:57:23 -0800
Subject: [Rd] Best way to reset random seed when using set.seed() in a
	function?
Message-ID: <59d7961d0802130857l7b4abcfcu891c066bcbe3d21a@mail.gmail.com>

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



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