2012-03-01 24 views
27

आर पैकेज जो मैं विकसित कर रहा हूं, कई आर डेटा ऑब्जेक्ट्स, जैसे पूर्व-गणना मॉडल और पैरामीटर की आवश्यकता होती है।आप पैकेज में आर डेटा आंतरिक कैसे संभालते हैं?

वर्तमान में मेरे पास व्यक्तिगत रूप से पैकेज की 'डेटा' निर्देशिका में प्रत्येक वस्तु है। डेटा फ़ाइलें। पैकेज का उपयोग करते समय उपयोगकर्ता इन ऑब्जेक्ट्स को अपने पर्यावरण में संलग्न करने के लिए "डेटा" फ़ंक्शन का उपयोग कर सकते हैं।

व्यवहार जो मैं चाहता हूं वह यह होगा कि पैकेज लोड करने पर डेटा ऑब्जेक्ट स्वचालित रूप से आंतरिक पैकेज वातावरण से जुड़े होते हैं और सीधे उपयोगकर्ता तक पहुंच योग्य नहीं होते हैं।

मेरी समझ यह है कि 'डेटा' में मौजूद वस्तुओं वाले पैकेज की 'आर' निर्देशिका में 'sysdata.rda' फ़ाइल डालने से मुझे वांछित परिणाम मिलेगा। हालांकि, ऐसा करने का कोई तरीका है ताकि मैं प्रत्येक ऑब्जेक्ट को एक साथ समूहित करने के बजाय अलग फ़ाइल में रख सकूं?

+0

प्रत्येक ऑब्जेक्ट को एक अलग फ़ाइल में क्यों डालें, प्रत्येक ऑब्जेक्ट को अलग से क्यों न देखें? उदा।, 'Packagename ::: a' और' packagename ::: b'। –

+0

@the_skua अलग-अलग फ़ाइलें पैकेज में आसान फ़ाइल संस्करण प्रबंधन के लिए उपयोगी थीं। यह थोड़ी देर पहले था, लेकिन मुझे लगता है कि मेरे पास पैकेज के हिस्से के रूप में अलग-अलग मॉडल फिट बैठे थे और कभी-कभी हम इनमें से एक को अपडेट करना चाहते हैं, लेकिन उनमें से सभी नहीं। – Nixuz

उत्तर

9

आप .onLoad() हुक का उपयोग data() पर कॉल करने के लिए कर सकते हैं जब आपका पैकेज लोड हो रहा है, और पैकेज नामस्थान को डेटा ऑब्जेक्ट्स को लोड करने के लिए पर्यावरण के रूप में निर्दिष्ट करें।

मान लिया जाये कि आप फ़ाइलों model1.R और foopkg बुलाया अपने पैकेज के data/ निर्देशिका में mydata.RData है, अपने पैकेज में कहीं समारोह

.onLoad <- function(libname, pkgname) { 
    data("model1", "mydata", package=pkgname, envir=parent.env(environment())) 
} 

परिभाषित करते हैं (foopkg-package.R में उदा)।

निर्माण और पैकेज को स्थापित करने के बाद,

> library(foopkg) 
> ls(loadNamespace("foopkg")) 

प्रदर्शित करना चाहिए कि विभिन्न डेटा वस्तुओं सफलतापूर्वक पैकेज नाम स्थान में लोड कर रहे थे, अर्थात अपने पैकेज में कार्यों को दिखाई लेकिन वैश्विक वातावरण को प्रदूषित नहीं।

12

अपने पैकेज की data निर्देशिका में अपनी sysdata.rda फ़ाइल डालें।

लेज़ी डाटा का प्रयोग न करें - अपने वर्णन फ़ाइल या तो LazyData के लिए एक लाइन नहीं करना चाहिए था, या, यदि ऐसा है, तो यह अपने पैकेज के आर निर्देशिका में LazyData: no

किसी भी .R फ़ाइल में होना चाहिए इस

data(sysdata, envir=environment()) 

की तरह एक पंक्ति जोड़ें मैं एक data.framesysdata नाम बनाया और कहा जाता है एक पैकेज के डेटा निर्देशिका में sysdata.rda कहा जाता है एक फ़ाइल में सहेजा गया anRpackage

मैंने उपर्युक्त पंक्ति को एक आरआर फ़ाइल में जोड़ा, और यह भी दिखाने के लिए कि इस पैकेज में फ़ंक्शंस में डेटा तक पहुंच है, यह अनपेक्षित फ़ंक्शन भी जोड़ा गया है।

foo <- function() tail(sysdata, 2) 

तो मैं एक अनुसंधान सत्र

> library(anRpackage) 
> sysdata 
Error: object 'sysdata' not found 

> anRpackage:::sysdata 
    A B C 
1 1 6 a 
2 2 7 b 
3 3 8 c 
4 4 9 d 
5 5 10 e 

> anRpackage:::foo() 
    A B C 
4 4 9 d 
5 5 10 e 

तो, उपयोगकर्ताओं को अब भी डेटा तक पहुंच निम्नलिखित देखते हैं, लेकिन जैसा कि आप का अनुरोध किया है, वे प्रत्यक्ष पहुँच नहीं है। उपयोगकर्ता के पास अभी भी data(sysdata) चलाने का विकल्प है।

+3

यह प्रतिक्रिया प्रश्न का उत्तर नहीं देती है। मैं अलग-अलग फाइलों में डेटा के विभाजन के बारे में पूछ रहा हूं, डेटा एक्सेसिबिलिटी स्कोपिंग के बारे में नहीं। – Nixuz

+1

आप कहते हैं कि वर्तमान में डेटा निर्देशिका में आपके पास बहुत सारी डेटा फ़ाइलें हैं। तो, उन डेटा फ़ाइलों में से प्रत्येक के लिए 'डेटा (sysdata, envir = environment())' जैसी रेखा जोड़ें ताकि वे "स्वचालित रूप से आंतरिक पैकेज वातावरण से जुड़े हों और सीधे उपयोगकर्ता तक पहुंच योग्य न हों।" कृपया जो भी आप चाहते हैं उसे स्पष्ट करें। – GSee