30

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 を作成するにはどうすればよいですか?

4

2 に答える 2

41

このような何かが私のためにそれを行います:

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
于 2013-01-14T18:27:43.087 に答える