12

Rは.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にラップループ内にロードさせることはできません。

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
4

1 に答える 1

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、の無名関数の環境で割り当てられますがlapply、グローバル環境でrnorm()検索するためです。.Random.seed


記録のために、これが私の最初の試みです。これは特定の状況でのみ機能します。

を使用して修正する1つの方法があります<<-。(はい、私はこれが嫌われていることを知っていますが、おそらく正当化されます。別の方法は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()が別の関数にネストされている場合、このソリューションは機能しないことに注意してください。これ<<-は、グローバル環境ではなく、親環境でのみ評価されるためです。

于 2012-07-07T19:24:47.840 に答える