2013-01-14 28 views
22

Chciałbym ustawić nasiona w R tylko lokalnie (wewnątrz funkcji), ale wydaje się, że R ustawia nasiona nie tylko lokalnie, ale także globalnie. Oto prosty przykład tego, co próbuję (nie) robić.ustawienie nasion lokalnie (nie globalnie) w R

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

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

Moje pytania brzmią: dlaczego R ustawi ziarno na całym świecie, a nie tylko wewnątrz mojej funkcji? I jak mogę sprawić, żeby R ustawiał ziarno tylko w mojej funkcji?

Odpowiedz

32

Coś takiego robi to dla mnie:

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

czy może bardziej elegancko:

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

Na przykład:

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

Dziękujemy! Spróbuję twojej odpowiedzi. Każdy pomysł, dlaczego R ma ten nieoczekiwany (przynajmniej dla mnie) efekt uboczny? –

+2

tak: według projektu :-) –

+1

+1 Pokonaj mnie. @ManoelGaldino Co do "dlaczego?" Nie sądzę, żeby było to w ogóle nieoczekiwane. Wdrożenie nowego, oddzielnego generatora losowego dla każdego środowiska funkcjonalnego byłoby strasznie skomplikowane, jak sądzę. I być może poniosą pewną poprawę wydajności. – joran