From ripley at stats.ox.ac.uk  Wed Feb 13 18:32:10 2008
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Wed, 13 Feb 2008 17:32:10 +0000 (GMT)
Subject: [Rd] Best way to reset random seed when using set.seed() in a
 function?
In-Reply-To: <59d7961d0802130857l7b4abcfcu891c066bcbe3d21a@mail.gmail.com>
References: <59d7961d0802130857l7b4abcfcu891c066bcbe3d21a@mail.gmail.com>
Message-ID: <Pine.LNX.4.64.0802131726060.15124@auk.stats>

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.

> 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



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