首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R set.seed()范围

R set.seed()范围
EN

Stack Overflow用户
提问于 2014-08-26 18:53:12
回答 4查看 7.6K关注 0票数 11

我的R脚本调用包含set.seed()的子函数。set.seed()的作用域是什么?它也会影响主程序调用它吗?

更具体一点

代码语言:javascript
复制
# main program
callsubfun()

... some statement ...

sample.int(100,20)



# sub function
callsubfun <- function(x,y,...){
   set.seed(100)
   ... do the work ...
   return(something)
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-26 19:20:44

set.seed确实是全球性的。但请注意?set.seed中的示例

代码语言:javascript
复制
## 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的调用并没有将可再现性传递给主程序。

代码语言:javascript
复制
subfun <- function() {
    set.seed(100)
    rnorm(1)
    #rm(.Random.seed, envir=.GlobalEnv)
}

subfun()
#[1] -0.5022

rnorm(1)
# [1] 0.1315
票数 13
EN

Stack Overflow用户

发布于 2014-08-26 18:58:16

你不应该这么做的原因如下:

代码语言:javascript
复制
> 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!
票数 3
EN

Stack Overflow用户

发布于 2018-10-20 12:15:26

set.seed函数为自身之后的所有代码提供特定的随机状态。但是,它之前的代码不会受到影响。下面是一个很小的例子。

代码语言:javascript
复制
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)。

代码语言:javascript
复制
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)。

  1. 您将发现set.seed旁边的所有代码都固定在给定的随机状态下。
  2. 但是set.seed之前的代码在两次试验中是不同的,这支持了我的观点。
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25513204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档