2012-06-26 12 views
18

आर द्वारा डेटा फ्रेम पास करने से पास-दर-मूल्य अर्थशास्त्र है, जो आकस्मिक साइड इफेक्ट्स (एक अच्छी बात) को कम करता है। हालांकि, जब पुन: प्रयोज्यता/पठनीयता/रखरखाव के लिए कई कार्यों/विधियों में कोड व्यवस्थित किया जाता है और जब उस कोड को बड़े डेटा संरचनाओं में हेरफेर करने की आवश्यकता होती है, उदाहरण के लिए, बड़े डेटा फ्रेम, परिवर्तन/संचालन की श्रृंखला के माध्यम से पास-बाय-वैल्यू सेमेंटिक्स लीड डेटा के बहुत सारे प्रतिलिपि और बहुत ढेर थ्रैशिंग (एक बुरी चीज) के लिए। उदाहरण के लिए, फ़ंक्शन पैरामीटर के रूप में पारित होने वाले ढेर पर 50 एमबी लगने वाला एक डेटा फ्रेम कम से कम उसी समय कॉपी किया जाएगा जैसे कॉल कॉल गहराई और कॉल स्टैक के नीचे ढेर आकार एन * 50Mb। यदि फ़ंक्शन कॉल श्रृंखला में गहराई से एक परिवर्तित/संशोधित डेटा फ्रेम लौटाते हैं तो प्रतिलिपि अन्य एनआर: संदर्भ

SO प्रश्न What is the best way to avoid passing a data frame around? इस विषय को छूता है लेकिन इस तरह से वाक्यांशित किया जाता है जो सीधे पास-पास पूछने से बचाता है -प्रभावन प्रश्न और विजेता उत्तर मूल रूप से कहता है, "हां, पास-दर-मूल्य यह है कि आर कैसे काम करता है"। यह वास्तव में 100% सटीक नहीं है। आर वातावरण पास-दर-संदर्भ अर्थशास्त्र और ओओ ढांचे को सक्षम करते हैं जैसे proto इस क्षमता का व्यापक रूप से उपयोग करते हैं। उदाहरण के लिए, जब एक प्रोटो ऑब्जेक्ट फ़ंक्शन तर्क के रूप में पारित किया जाता है, जबकि इसका "जादू रैपर" मूल्य द्वारा पारित किया जाता है, आर डेवलपर को अर्थशास्त्र पास-दर-संदर्भ होते हैं।

ऐसा लगता है कि संदर्भ द्वारा एक बड़ा डेटा फ्रेम पास करना एक आम समस्या होगी और मैं सोच रहा हूं कि दूसरों ने इसका कैसे संपर्क किया है और क्या कोई पुस्तकालय है जो इसे सक्षम करता है। मेरी खोज में मैंने एक खोज नहीं की है।

यदि कुछ भी उपलब्ध नहीं है, तो मेरा दृष्टिकोण एक प्रोटो ऑब्जेक्ट बनाना होगा जो डेटा फ्रेम को लपेटता है। मैं सिंटैक्टिक चीनी के बारे में पॉइंटर्स की सराहना करता हूं जिसे इसे उपयोगी बनाने के लिए इस ऑब्जेक्ट में जोड़ा जाना चाहिए, उदाहरण के लिए, $ और [[ऑपरेटरों के साथ-साथ किसी भी गॉथस के लिए मुझे देखना चाहिए। मैं एक आर विशेषज्ञ नहीं हूँ।

बोनस एक प्रकार-अज्ञेय पास-बाय-रेफरेंस समाधान के लिए इंगित करता है जो आर के साथ अच्छी तरह से एकीकृत करता है, हालांकि मेरी ज़रूरतें विशेष रूप से डेटा फ्रेम के साथ होती हैं।

+4

मुझे नहीं लगता कि आपके प्रश्न का आधार सही है। आर केवल परिवर्तन पर प्रतिलिपि बनाता है, ताकि जब तक आप ऑब्जेक्ट को नहीं बदलते, तब तक आप नए प्रतिलिपि किए बिना कॉल स्टैक के नीचे खुशी से गुजर सकते हैं।मैं आपको एक मिनट में इस बारे में कुछ संदर्भों का प्रयास करने और ढूंढने की कोशिश करूंगा। – Andrie

+0

उदाहरण के लिए इस सवाल और इसके जवाब @matthewdowle द्वारा देखें: http://stackoverflow.com/q/10225098/602276 – Andrie

+2

एंड्री सही है। आश्चर्यचकित है कि आपको ''data.table'] नहीं मिला है (http://datatable.r-forge.r-project.org/LondonR_2012.pdf) बड़ी' data.frame' के लिए आपकी खोजों में। आपने क्या खोजा –

उत्तर

26

प्रश्न का आधार (आंशिक रूप से) गलत है। आर पास-बाय-वादे के रूप में काम करता है और जिस तरह से आप रूपरेखा करते हैं उसमें प्रतिलिपि दोहराई जाती है जब डेटाफ्रेम को आगे असाइनमेंट और बदलाव किए जाते हैं क्योंकि वचन जारी किया जाता है। तो प्रतियों की संख्या एन * आकार नहीं होगी जहां एन ढेर गहराई है, बल्कि जहां एन स्तरों की संख्या है जहां असाइनमेंट किए जाते हैं। हालांकि, आप सही हैं कि वातावरण उपयोगी हो सकते हैं। मैं उस लिंक का पालन करने पर देखता हूं जिसे आपने पहले ही 'प्रोटो' पैकेज पाया है। कभी-कभी "संदर्भ वर्ग" का एक अपेक्षाकृत हालिया परिचय भी होता है जिसे कभी-कभी "आर 5" कहा जाता है जहां आर/एस 3 एस 3 की मूल श्रेणी प्रणाली थी जिसे आर और आर 4 में कॉपी किया गया है, जो हाल ही में क्लास सिस्टम होगा जो ज्यादातर समर्थन बायोकंडक्टर पैकेज विकास।

https://stat.ethz.ch/pipermail/r-help/2011-September/289987.html

मैथ्यू Dowle की:

यहाँ एक एस 4 ऑब्जेक्ट के अंदर एक ऐसा माहौल एम्बेड करने का यह (संदर्भ वर्गों की खूबियों पर चर्चा एक सूत्र में) नकल लागत से बचने के लिए स्टीव Lianoglou से एक उदाहरण के लिए एक लिंक है 'data.table' पैकेज डेटा ऑब्जेक्ट का एक नया वर्ग बनाता है जिसका उपयोग "[" नियमित आर डेटा.फ्रेम के मुकाबले अलग है, और जो वास्तव में पास-बाय-रेफरेंस के रूप में काम कर रहा है। इसमें पहुंच और प्रसंस्करण की बेहतर गति है। यह बाद के वर्षों में डेटाफ्रेम सेमेन्टिक्स पर भी वापस आ सकता है क्योंकि ऐसी ऑब्जेक्ट्स अब 'data.frame' वर्ग का उत्तराधिकारी है।

आप Hesterberg's dataframe package की जांच भी कर सकते हैं।

+1

+1 मैं इस उत्तर को विस्तार और सुधारने के लिए आपके लिए खुश हूं। – Andrie

+1

और डेटाफ्रेम पैकेज के लिंक के लिए +1, जिसे अब जानकारी के लिए धन्यवाद 2.15-1 – Andrie

+1

@DWin में शामिल किया गया है (या कम से कम दर्शन में)। पास-बाय-वादा एक अनुकूलन के रूप में समझ में आता है, हालांकि यह मेरे मामले में मदद नहीं करता है जहां एक ही डेटा फ्रेम पर कई चरणों को "कच्चे" से संसाधित करने के लिए चालू किया जाता है। आम तौर पर संशोधनों को एक प्रसंस्करण पाइपलाइन के अलग-अलग चरणों में किया जाता है लेकिन कुछ मामलों में वे एक ही कॉल श्रृंखला में प्रदर्शन किए जाते हैं क्योंकि विभिन्न आविष्कारों के साथ अमूर्त सीमाएं पार हो जाती हैं। मैं आपके द्वारा अनुशंसित संकुलों को देखूंगा। – Sim