Подтвердить что ты не робот

Установка семян локально (не глобально) в 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 установить семя только внутри моей функции?

4b9b3361

Ответ 1

Что-то вроде этого делает это для меня:

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