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

Henrik Bengtsson hb at stat.berkeley.edu
Wed Feb 13 18:58:55 CET 2008


On Feb 13, 2008 9:32 AM, Prof Brian Ripley <ripley at stats.ox.ac.uk> wrote:
> On Wed, 13 Feb 2008, Henrik Bengtsson wrote:
>
> > 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.
>
> It is necessary.  Of course, any use of random numbers modifies this
> variable in the global environment, so many, many functions already do.
>
> There is a write-up in 'R Internals' of what is permissible in
> modifying the base and global environments.

Thank you, and thanks for the pointer.  I had another question if
'.Random.seed' can end up somewhere else than in the global
environment, but 'R Internals' clearly states that .Random.seed
belongs in the global environment.  My short example was not explicit
about that (and hence to bullet proof).  Here is an update version:

foo <- function(n) {
  # Store old random state
  if (!exists(".Random.seed", mode="numeric", envir=globalenv()))
    sample(NA);
  oldSeed <- get(".Random.seed", mode="numeric", envir=globalenv());

  # 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)) ));

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

  # Continue as nothing happened
  sample(n);
}

Cheers

Henrik


>
>
> > 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
> >
> > ______________________________________________
> > R-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
>
> --
> Brian D. Ripley,                  ripley at stats.ox.ac.uk
> Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
> University of Oxford,             Tel:  +44 1865 272861 (self)
> 1 South Parks Road,                     +44 1865 272866 (PA)
> Oxford OX1 3TG, UK                Fax:  +44 1865 272595
>



More information about the R-devel mailing list