2013-01-14 6 views
22

Ich möchte Seeds in R nur lokal (innerhalb Funktionen), aber es scheint, dass R setzt Samen nicht nur lokal, sondern auch global. Hier ist ein einfaches Beispiel dafür, was ich versuche (nicht).Setze Seed lokal (nicht global) in R

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

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

Also, meine Fragen sind: Warum setzt R den Keim global und nicht nur in meiner Funktion? Und wie kann ich R setzen, um den Keim nur innerhalb meiner Funktion zu setzen?

Antwort

32

So etwas tut es für mich:

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

Oder vielleicht elegante:

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

Zum Beispiel:

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

Vielen Dank! Ich werde deine Antwort versuchen. Irgendeine Idee, warum R diese (zumindest für mich) unerwartete Nebenwirkung hat? –

+2

ja: nach Design :-) –

+1

+1 Beat mich dazu. @ManoelGaldino Zu "warum?" Ich denke nicht, dass dies unerwartet ist. Die Implementierung eines neuen, separaten Zufallsgenerators für jede Funktionsumgebung wäre furchtbar kompliziert, denke ich. Und möglicherweise einige Performance Overhead tragen. – joran