2013-01-14 8 views
22

Mi piacerebbe impostare i semi in R solo localmente (all'interno di funzioni), ma sembra che R set seme non solo localmente, ma anche a livello globale. Ecco un semplice esempio di ciò che sto cercando (non) di fare.impostazione di seed localmente (non globalmente) in R

myfunction <- function() { 
    set.seed(2) 
} 

# now, whenever I run the two commands below I'll get the same answer 
myfunction() 
runif(1) 

Quindi, le mie domande sono: perché R imposta il seme globalmente e non solo all'interno della mia funzione? E come posso far sì che R imposti il ​​seme solo all'interno della mia funzione?

risposta

32

Qualcosa del genere lo fa per me:

myfunction <- function() { 
    old <- .Random.seed 
    set.seed(2) 
    res <- runif(1) 
    .Random.seed <<- old 
    res 
} 

O forse più elegante:

myfunction <- function() { 
    old <- .Random.seed 
    on.exit({ .Random.seed <<- old }) 
    set.seed(2) 
    runif(1) 
} 

Ad esempio:

> myfunction() 
[1] 0.1848823 
> runif(1) 
[1] 0.3472722 
> myfunction() 
[1] 0.1848823 
> runif(1) 
[1] 0.4887732 
+0

Grazie! Proverò la tua risposta. Qualche idea sul perché R abbia questo effetto collaterale inaspettato (almeno per me)? –

+2

sì: per progetto :-) –

+1

+1 Mi picchia. @ManoelGaldino Per quanto riguarda "perché?" Non penso che questo sia inaspettato. Implementare un nuovo generatore casuale separato per ogni ambiente di funzione sarebbe terribilmente complicato, penserei. E possibilmente portare qualche sovraccarico di prestazioni. – joran