From pgilbert at bank-banque-canada.ca  Wed Feb 13 20:07:21 2008
From: pgilbert at bank-banque-canada.ca (Paul Gilbert)
Date: Wed, 13 Feb 2008 14:07:21 -0500
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: <47B33FE9.2090301@bank-banque-canada.ca>

I think in general it is a good idea to use  on.exit()  to reset the 
seed if you mess with it. Otherwise you can generate unintended 
consequences for other programs. Something like:
    old.seed <- setRNG(kind = "default", seed = test.seed, normal.kind = 
"default")
    on.exit(setRNG(old.seed))

(BTW, setRNG is a simple little utility in the setRNG package, to help 
set and save some of the other things you need besides the seed, if you 
are going to try to reproduce results.)

Paul

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.
>
> 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
>   
====================================================================================

La version fran?aise suit le texte anglais.

------------------------------------------------------------------------------------

This email may contain privileged and/or confidential in...{{dropped:26}}



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