我的R脚本调用包含set.seed()的子函数。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)
}发布于 2014-08-26 19:20:44
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会话中运行以下代码。两届会议的产出应相同。然后,在两个新的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发布于 2014-08-26 18:58:16
你不应该这么做的原因如下:
> 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!发布于 2018-10-20 12:15:26
set.seed函数为自身之后的所有代码提供特定的随机状态。但是,它之前的代码不会受到影响。下面是一个很小的例子。
rnorm(1)
#> [1] -0.1020965
set.seed(123)
rnorm(1)
#> [1] -0.5604756
rnorm(1)
#> [1] -0.2301775
rnorm(1)
#> [1] 1.558708由reprex package创建于2018-10-20 (v0.2.0)。
rnorm(1)
#> [1] 0.4665633
set.seed(123)
rnorm(1)
#> [1] -0.5604756
rnorm(1)
#> [1] -0.2301775
rnorm(1)
#> [1] 1.558708由reprex package创建于2018-10-20 (v0.2.0)。
set.seed旁边的所有代码都固定在给定的随机状态下。set.seed之前的代码在两次试验中是不同的,这支持了我的观点。https://stackoverflow.com/questions/25513204
复制相似问题