2012-07-07 22 views
11

आर एक लापरवाही के अंदर .Random.seed सेटिंग को अनदेखा करता है। हालांकि set.seed का उपयोग करना ठीक काम करता है।यादृच्छिक संख्या जनरेटर की स्थिति को पुनर्स्थापित करने के लिए मैं आर को लापरवाही (और mclapply) कैसे प्राप्त कर सकता हूं?

कुछ कोड:

# 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 

मेरा लक्ष्य जांच की चौकी के एमसीएमसी चलाता है ताकि वे वास्तव में फिर से शुरू किया जा सकता है। मैं आसानी से आरएनजी की स्थिति को बचा सकता हूं, मैं इसे लापरवाही लूप के अंदर लोड करने के लिए आर नहीं प्राप्त कर सकता!

क्या .Random.seed सेटिंग को नोटिस करने के लिए आर को मजबूर करने का कोई तरीका है? या ऐसा करने का एक आसान तरीका है?

मामले यह मायने रखता है में, मैं उपयोग कर रहा हूँ 64 बिट आर:

R version 2.15.1 (2012-06-22) -- "Roasted Marshmallows" 
Platform: x86_64-pc-linux-gnu (64-bit) 

Ubuntu 12.04 LTS पर:

[email protected]:~$ 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

+1 बहुत ही रोचक सवाल, धन्यवाद। – Andrie

उत्तर

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.seedlapply में गुमनाम समारोह के वातावरण में सौंपा जाता है, लेकिन 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() एक और में नीडिंत है काम नहीं करेगा समारोह, <<- केवल वैश्विक पर्यावरण में नहीं, बल्कि वैश्विक पर्यावरण में मूल्यांकन करता है।

+1

शायद नामित वातावरण में। random.seed सामान्यता में वृद्धि करेगा? या एक संदर्भ वर्ग समाधान –

+4

भी 'CHobalEnv $ का उपयोग कर सकता है। Random.seed <- x' या 'globalobalEnv [["। Random.seed "]] <- x'। –

+0

यह बहुत अच्छा काम करता है, धन्यवाद! –