2013-01-14 3 views
22

シードをRでローカルに(関数内で)設定したいが、Rはローカルだけでなくグローバルにもシードを設定するようだ。ここで私が何をしようとしているのかの簡単な例があります。シードをローカルに設定する(グローバルではない)R

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

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

私の質問には次のようなものがあります。なぜRは自分の関数内だけでなく、グローバルにシードを設定するのですか?そして私はRを私の機能の中だけに種子を置くようにすることができますか?このような

答えて

32

何かが私のためにそれをしない:

よりエレガントに
myfunction <- function() { 
    old <- .Random.seed 
    set.seed(2) 
    res <- runif(1) 
    .Random.seed <<- old 
    res 
} 

それとも:たとえば

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

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

ありがとうございました!私はあなたの答えを試してみます。 Rにこの予期しない(少なくとも私にとって)副作用がある理由は何ですか? –

+2

はい:デザインによって:-) –

+1

+1私をビートしてください。 @ManoelGaldino "なぜ?"私はこれがまったく予期しないとは思わない。あらゆる機能環境のための新しい、別々のランダムジェネレータを実装することはひどく複雑になるでしょう、と私は思います。また、パフォーマンス上のオーバーヘッドが発生する可能性があります – joran

関連する問題