R忽略在lapply中设置.Random.seed
。但是,使用set.seed
可以正常工作。
一些代码:
# I can save the state of the RNG for a few seeds
seed.list <- lapply( 1:5, function(x) {
set.seed(x)
seed.state <- .Random.seed
print( rnorm(1) )
return( seed.state )})
#[1] -0.6264538
#[1] -0.8969145
#[1] -0.9619334
# But I get different numbers if I try to restore
# the state of the RNG inside of an lapply
tmp.rest.state <- lapply(1:5, function(x) {
.Random.seed <- seed.list[[x]]
print(rnorm(1))})
# [1] -0.2925257
# [1] 0.2587882
# [1] -1.152132
# lapply is just ignoring the assignment of .Random.seed
.Random.seed <- seed.list[[3]]
print( rnorm(1) ) # The last printed value from seed.list
# [1] -0.9619334
print( rnorm(1) ) # The first value in tmp.rest.state
# [1] -0.2925257
我的目标是检查点MCMC运行,以便它们可以完全恢复。我可以很容易地保存RNG的状态,我只是不能让R在一个lapply循环中加载它!
有没有办法强制R注意设置.Random.seed
?或者有更简单的方法来实现这一目标吗?
如果重要,我使用的是64位R:
R version 2.15.1 (2012-06-22) -- "Roasted Marshmallows"
Platform: x86_64-pc-linux-gnu (64-bit)
在Ubuntu 12.04上LTS:
nathanvan@nathanvan-N61Jq:~$ uname -a
Linux nathanvan-N61Jq 3.2.0-26-generic #41-Ubuntu SMP Thu Jun 14 17:49:24 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
答案 0 :(得分:10)
这是因为.Random.seed
被评估为您对lapply
的调用中的本地对象。
您需要在全局环境中指定.Random.seed
的值:
tmp.rest.state <- lapply(seed.list, function(x) {
assign(".Random.seed", x, envir=globalenv())
print(rnorm(1))
}
)
[1] -0.6264538
[1] -0.8969145
[1] -0.9619334
[1] 0.2167549
[1] -0.8408555
您的代码不起作用的原因是.Random.seed
在[{1}}中的匿名函数环境中分配lapply
,但rnorm()
在全球范围内查找.Random.seed
环境。
为了记录,这是我的第一次尝试,它只适用于某些情况:
以下是使用<<-
修复此问题的一种方法。 (是的,我知道这是不赞成的,但可能是合理的。另一种方法是使用eval()
并在调用环境中强制进行评估。
tmp.rest.state <- lapply(seed.list, function(x) {
.Random.seed <<- x
print(rnorm(1))
}
)
[1] -0.6264538
[1] -0.8969145
[1] -0.9619334
[1] 0.2167549
[1] -0.8408555
请注意,如果lapply()
嵌套在另一个函数中,则此解决方案将无效,因为<<-
仅在父环境中进行评估,而不是在全局环境中进行评估。