2016-09-28 7 views
7

कार्यक्रम 1:इसका उपयोग करते समय लूप वैरिएबल का पता क्यों बदल रहा है?

library(pryr) 

for (x in 1:3) { 
    print(c(address(x), refs(x))) 
} 

आउटपुट जैसे:

[1] "0x7a6a6c8" "1"   
[1] "0x7a6a6c8" "1"   
[1] "0x7a6a6c8" "1" 

कार्यक्रम 2:

library(pryr) 

for (x in 1:3) { 
    print(c(address(x), refs(x))) 
    print(x) 
} 

आउटपुट जैसे:

[1] "0x7ae0298" "1"   
[1] 1 
[1] "0x7ae88c8" "1"   
[1] 2 
[1] "0x7af2668" "1"   
[1] 3 

जाहिर एक्स का मान बदल रहा है progra एम 2, लेकिन एड्रेस भी क्यों बदल रहा है? क्या लूप के दौरान जीसी नहीं कहा जाता है, जबकि 500,000,000 बार चलने के लिए लूप होने पर मेमोरी लीक हो सकता है?

+2

आप के साथ एक अनुसंधान पाश चलाते हैं 5e8 पुनरावृत्तियों को आपको प्रदर्शन के बारे में चिंता करनी चाहिए और स्मृति रिसाव नहीं है (कोई भी नहीं है)। – Roland

+1

आपका आर संस्करण क्या है? जब तक लूपिंग चर का उपयोग कहीं भी/असाइन नहीं किया जाता है, आर फिर से आवंटित करने से बचाता है। जैसे 'के लिए तुलना करें (x में 1: 3) {। अनंत (निरीक्षण (एक्स))} 'वीएस' के लिए (x में 1: 3) {(फ़ंक्शन (वैल) वैल) (x); आंतरिक (निरीक्षण (एक्स))} '। ("X" पर एक साधारण बंद करने के लिए, "x" को बहु-संदर्भित के रूप में चिह्नित किया गया है) –

+0

मैं संस्करण 3.3.1 का उपयोग करता हूं, मैं आउटपुट को संदर्भों की संख्या देने के लिए संपादित करने जा रहा हूं। – Wipster

उत्तर

1

लूप के अंत में प्रिंट (x) होने के कारण इसे बहु-संदर्भ के रूप में चिह्नित किया गया है, जैसा कि @alexis_laz का उल्लेख है। चूंकि आर एक गतिशील भाषा है, यह आसानी से हो सकता है। इस के प्रभाव का परीक्षण करने के लिए, हम refs के उत्पादन में (एक्स), प्रिंट प्रिंट कर सकते हैं (x), refs (एक्स):

for (x in 1:3) { 
    print(refs(x)) 
    print(x) 
    print(refs(x)); cat("\n") 
} 

आउटपुट:

[1] 1 
[1] 1 
[1] 2 

[1] 1 
[1] 2 
[1] 2 

[1] 1 
[1] 3 
[1] 2 
संबंधित मुद्दे

 संबंधित मुद्दे