R набор.область применения seed ()
мой скрипт R вызывает подфункции, которые содержат set.семя.)( Что такое объем.seed()? Повлияет ли это также на основную программу, которая его вызывает?
более конкретно
# main program
callsubfun()
... some statement ...
sample.int(100,20)
# sub function
callsubfun <- function(x,y,...){
set.seed(100)
... do the work ...
return(something)
}
3 ответов
set.seed
действительно глобальный. Но обратите внимание на это из примера в ?set.seed
:
## If there is no seed, a "random" new one is created:
rm(.Random.seed); runif(1); .Random.seed[1:6]
это означает, что вы можете позвонить rm(.Random.seed, envir=.GlobalEnv)
либо в конце вашей функции, либо после вызова функции, чтобы отделить остальную часть программы от вызова set.seed
в функции.
чтобы увидеть это в действии, запустите следующий код в двух разных Р сессий. Результаты обеих сессий должны быть одинаковыми. Затем повторно запустите код снова в двух новых сеансах R с помощью rm
линия закомментированная. Вы увидите, что выходные данные в двух новых сеансах теперь отличаются, указывая, что вызов set.seed
в функции не передана воспроизводимость в основную программу.
subfun <- function() {
set.seed(100)
rnorm(1)
#rm(.Random.seed, envir=.GlobalEnv)
}
subfun()
#[1] -0.5022
rnorm(1)
# [1] 0.1315
вот почему вы не должны делать это:
> set.seed(100)
> rnorm(1)
[1] -0.5021924
> rnorm(1)
[1] 0.1315312
> rand <- function() set.seed(100)
> rand()
> rnorm(1)
[1] -0.5021924 # Ouch!
ответ BondedDust в порядке, но не всегда Ой!
вы можете использовать set.seed () для воспроизведения вашего алгоритм. то есть любой может воспроизвести ваши результаты.
Я рекомендую вам использовать set.семя, если ты хочешь поделиться своим код. Например, если вам нужна помощь в stackoverflow, мы могли бы воспроизвести точно ваш код.
set.seed(123)
rand<-rnorm(10)
plot(density(rand))
Если вы используете другое семя, вы получите другие результаты
set.seed(234)
rand<-rnorm(10)
plot(density(rand))
оба правильны, но это может быть проще помочь вам, если семя было известно. Кстати, просто используйте set.семя однажды попало в твой рутин, потому что ты мог бы произвести зависимость в ваших случайных числах. Мы желаем независимых случайных чисел в симуляции.