2012-05-18 19 views
15

द्वारा पारित करें, मैं मेमोरी उपयोग के संबंध में कार्यों के तर्कों को पारित करने, चर की प्रतियां इत्यादि बनाते समय तर्क आर का उपयोग करना चाहता हूं। यह वास्तव में चर परिवर्तक की एक प्रति बनाते हैं, बस उस चर के संदर्भ को पारित करते हैं? विशेष रूप से स्थितियों के बारे में मैं उत्सुक हूँ हैं:आर, गहरी बनाम उथली प्रतियां, संदर्भ

f <- function(x) {x+1} 
a <- 1 
f(a) 

a सचमुच पारित किया जा रहा है या एक पारित किया जा रहा करने के लिए एक संदर्भ है?

x <- 1 
y <- x 

प्रतिलिपि का संदर्भ? यह मामला कब नहीं है?

अगर कोई मुझे यह समझा सकता है तो मैं अत्यधिक सराहना करता हूं।

+3

आप मिल सकती है [इस] (http://cran.at.r-project.org/doc/manuals/R आर भाषा परिभाषा सहायक के -lang.html # मूल्यांकन) खंड। – joran

+2

मोरांडाट और सहकर्मियों द्वारा इस पत्र में आर में तर्कों के आलसी मूल्यांकन की एक दिलचस्प और महत्वपूर्ण चर्चा है: http://www.cs.purdue.edu/homes/jv/pubs/ecoop12.pdf – jthetzel

+4

उचित रूप से 'tracemem' का उपयोग करना संकलित आर खोज के लिए सहायक हो सकता है, जैसा कि 'एनएएमएड फ़ील्ड' की समझ के साथ 'आंतरिक (निरीक्षण (एक्स)) 'कर सकता है; मेरा सामान्य मंत्र 'कॉपी-ऑन-चेंज' है, उदाहरण के लिए आपका 'y <- x' एक प्रतिलिपि (अभी तक) ट्रिगर नहीं करता है क्योंकि मूल में कोई बदलाव नहीं आया है, स्मृति' x' (और ' y') 'NAMED' है जैसे कि या तो एक प्रतिलिपि एक प्रतिलिपि ट्रिगर करेगा। –

उत्तर

12

जब यह चर से गुजरता है, तो यह हमेशा संदर्भ के बजाय प्रतिलिपि द्वारा होता है। कभी-कभी, हालांकि, जब तक कोई असाइनमेंट वास्तव में नहीं होता तब तक आपको एक प्रतिलिपि नहीं मिल जाएगी। प्रक्रिया का असली विवरण पास-बाय-वादा है। प्रलेखन पर एक नज़र डालें

?force 
?delayedAssign 

एक व्यावहारिक निहितार्थ यह है कि यह बहुत मुश्किल है असंभव नहीं तो कम से कम दो बार के रूप में ज्यादा रैम की आवश्यकता होगी, के रूप में अपने वस्तुओं नाममात्र पर कब्जा से बचना है। एक बड़ी वस्तु को संशोधित करने के लिए आम तौर पर अस्थायी प्रतिलिपि बनाने की आवश्यकता होती है।

अपडेट: 2015: मै मैट डॉउल के साथ सहमत हूं और किया है कि उसका डेटाटेबल पैकेज असाइनमेंट के लिए एक वैकल्पिक मार्ग प्रदान करता है जो कॉपी-डुप्लिकेशन समस्या से बचाता है। अगर वह अनुरोध अनुरोध किया गया था, तो सुझाव के समय मुझे समझ में नहीं आया था।

apply और Reduce के मूल्यांकन नियमों में आर 3.2.1 में हालिया परिवर्तन हुआ था। यह समाचार यहां के संदर्भ में SO-घोषणा की गई थी: Returning anonymous functions from lapply - what is going wrong?

और interesting paper cited by jhetzel in the comments is now here:

+8

['data.table'] दर्ज करें (http://datatable.r-forge.r-project.org/)। पैकेज में 'कॉपी' देखें। संदर्भ द्वारा असाइनमेंट ': =' ऑपरेटर के साथ संभव है, '? ": =" 'और' set * 'फ़ंक्शंस की श्रृंखला देखें। पूरे ऑब्जेक्ट की 2-3 प्रतियों के लिए कमरे की आवश्यकता के बजाय, हमारा लक्ष्य केवल एक कॉलम की वर्किंग मेमोरी या उससे कम की आवश्यकता है। –

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