[R] Limiting the scope of RNGkind/set.seed
Elizabeth Purdom
epurdom @end|ng |rom @t@t@berke|ey@edu
Wed Apr 17 22:40:24 CEST 2019
Thanks Martin, this seems much better. All of the best, Elizabeth
> On Apr 16, 2019, at 10:22 AM, Martin Maechler <maechler using stat.math.ethz.ch> wrote:
>
>>>>>> Elizabeth Purdom
>>>>>> on Tue, 16 Apr 2019 09:45:45 -0700 writes:
>
>> Hi Bert, Thanks for your response. What you suggest is
>> more or less the fix I suggested in my email (my second
>> version of .rcolors). I writing more because I was
>> wondering if there was a better way to work with RNG that
>> would avoid doing that. It doesn’t feel very friendly for
>> my package to be making changes to the user’s global
>> environment, even though I am setting them back (and if it
>> weren’t for the fact that setting the new R 3.6 argument
>> `sample.kind=“Rounding”` creates a warning, I wouldn’t
>> have even realized I was affecting the user’s settings, so
>> it seems potentially hazardous that packages could be
>> changing users settings without them being aware of
>> it). So I was wondering if there was a way to more fully
>> isolate the command. Thanks, Elizabeth
>
> Hi Elizabeth,
>
> there's actually something better -- I think -- that you can do:
>
> You store .Random.seed before doing an RNGkind() & set.seed()
> setting, do all that, and make sure that .Random.seed is
> restored when leaving your function.
>
> This works because the (typically quite long) .Random.seed
> stores the full state of the RNG, i.e., all RNGkind() settings
> *and* the result of set.seed() , calling r<foo>(n, ..) etc.
>
> If you additionally use on.exit() instead of manually reset
> things, you have the additional advantage, that things are also
> reset when your functions ends because the user interrupts its
> computations, or an error happens, etc.
>
> So, your function would more elegantly (and robustly!) look like
>
> .rcolors <- function(seed = 23589) {
> if(!exists(".Random.seed", envir = .GlobalEnv)) {
> message("calling runif(1)"); runif(1) }
> old.R.s <- .Random.seed
> ## will reset everything on exiting this function:
> on.exit(assign(".Random.seed", old.R.s, envir=.GlobalEnv))
> ## set seed for sample() "back compatibly":
> suppressWarnings(RNGversion("3.5.0"))
> set.seed(seed)
> ## return random permutation of "my colors"
> sample(colors()[-c(152:361)])
> }
>
> BTW, you can look at simulate() methods in standard R, e.g.,
>
> stats:::simulate.lm
>
> to see the same method use [optionally, with slightly more sophistication]
>
>
> Best,
> Martin
>
> Martin Mächler
> ETH Zurich, Switzerland
More information about the R-help
mailing list