On Feb 13, 2008 9:32 AM, Prof Brian Ripley <[EMAIL PROTECTED]> 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@r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-devel > > > > -- > Brian D. Ripley, [EMAIL PROTECTED] > 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 > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel