आर

2013-01-14 38 views
22

में स्थानीय स्तर पर (वैश्विक रूप से नहीं) सेटिंग बीज मैं केवल स्थानीय रूप से (कार्यों के अंदर) में बीज सेट करना चाहता हूं, लेकिन ऐसा लगता है कि आर न केवल स्थानीय रूप से बल्कि वैश्विक स्तर पर बीज सेट करता है। यहां एक सरल उदाहरण है जो मैं करने की कोशिश कर रहा हूं (नहीं)।आर

myfunction <- function() { 
    set.seed(2) 
} 

# now, whenever I run the two commands below I'll get the same answer 
myfunction() 
runif(1) 

तो, मेरे प्रश्न हैं: आर वैश्विक स्तर पर बीज क्यों सेट करता है न केवल मेरे कार्य के अंदर? और मैं केवल अपने कार्य के अंदर बीज को सेट करने के लिए आर कैसे बना सकता हूं?

उत्तर

32

कुछ इस तरह मेरे लिए यह करता है:

myfunction <- function() { 
    old <- .Random.seed 
    set.seed(2) 
    res <- runif(1) 
    .Random.seed <<- old 
    res 
} 

या शायद अधिक सुंदर ढंग से:

myfunction <- function() { 
    old <- .Random.seed 
    on.exit({ .Random.seed <<- old }) 
    set.seed(2) 
    runif(1) 
} 

उदाहरण के लिए:

> myfunction() 
[1] 0.1848823 
> runif(1) 
[1] 0.3472722 
> myfunction() 
[1] 0.1848823 
> runif(1) 
[1] 0.4887732 
+0

धन्यवाद! मैं आपका जवाब आज़माउंगा। कोई विचार क्यों आर को यह अप्रत्याशित (कम से कम मेरे लिए) दुष्प्रभाव है? –

+2

हाँ: डिज़ाइन द्वारा :-) –

+1

+1 मुझे इसे मारो। @ManoelGaldino के रूप में "क्यों?" मुझे नहीं लगता कि यह अप्रत्याशित है। प्रत्येक समारोह पर्यावरण के लिए एक नया, अलग यादृच्छिक जनरेटर लागू करना बहुत जटिल होगा, मुझे लगता है। और संभवतः कुछ प्रदर्शन ओवरहेड ले जाते हैं। – joran