我正努力了解如何复制早期工作的结果。在运行运行X的循环之前,我设置了一个种子,在该循环的每次迭代中都发生了一些随机性。我现在正在运行一个较小的循环,并使用运行Y尝试在该较大循环的仅几次迭代中复制结果(即Y set.seed(23)
big_loop<-sapply(1:5,function(i) {
saveRDS(.Random.seed,paste0("run_",i,".RDS"))
sample(letters,1)
})
#I want to replicate the random letter draws on runs 2 and 3 of the big_loop
#I understand why this doesn't work
set.seed(23)
small_loop<-sapply(2:3,function(i) {
sample(letters,1)
})
#but I'm not sure why this doesn't work.
#how can I make it match runs 2 and 3 of the big loop?
set.seed(23)
small_loop2<-sapply(2:3,function(i) {
.Random.seed<-readRDS(paste0("run_",i,".RDS"))
sample(letters,1)
})
#i want this to be false
identical(big_loop[1:2],small_loop) #true
identical(big_loop[1:2],small_loop2) #true
#I want these to be true
identical(big_loop[2:3],small_loop) #false
identical(big_loop[2:3],small_loop2) #false
答案 0 :(得分:3)
R在全局环境中使用.Random.seed
,因此您必须在其中进行分配:如您所见,在函数环境中进行分配是行不通的。
small_loop2<-sapply(2:3,function(i) {
assign(".Random.seed",readRDS(paste0("run_",i,".RDS")),
envir=.GlobalEnv)
sample(letters,1)
})
small_loop2
## [1] "f" "i"
big_loop
## [1] "o" "f" "i" "s" "v"
该问题的另一种更方便的解决方案是在每次运行内 内依次设置种子:
big_loop<-sapply(1:5,function(i) {
set.seed(22+i)
sample(letters,1)
})
small_loop<-sapply(2:3,function(i) {
set.seed(22+i)
sample(letters,1)
})
通过这种方式,您可以重现结果而无需在周围移动.Random.seed
的繁琐内容。
建议使用顺序种子here;显然,SQL RAND()
是not reliable when seeded with sequential values,但是我不认为R的生成器有问题...