2013-04-23 23 views
13

मैं फ्लाई पर एक आर पैकेज के भीतर संदर्भ कक्षाएं उत्पन्न करने का प्रयास कर रहा हूं, और यह काफी मुश्किल साबित हो रहा है। यहां मैंने जो दृष्टिकोण उठाए हैं और जिन समस्याओं में मैंने भाग लिया है:गतिशील रूप से संदर्भ कक्षाएं उत्पन्न करें

मैं एक पैकेज बना रहा हूं जिसमें मुझे स्कीमा में गतिशील रूप से पढ़ने में सक्षम होने की उम्मीद है और स्वचालित रूप से एक संबंधित संदर्भ वर्ग उत्पन्न करें (SOAP सोचें) । बेशक, इसका मतलब है कि मैं पैकेज स्रोतों में हाथ से पहले अपने संदर्भ कक्षाओं को परिभाषित करने में सक्षम नहीं होगा।

मैं शुरू में एक सरल का उपयोग कर एक नया वर्ग बनाने का प्रयास किया:

myClass <- setRefClass("NewClassName", fields=list(fieldA="character")) 

जो, ज़ाहिर है, ठीक काम करता है जब सहभागी मार डाला, लेकिन जब पैकेज स्रोतों में शामिल है, मैं एक locked binding त्रुटि मिलती है। मेरे पढ़ने से, ऐसा लगता है कि ऐसा इसलिए होता है क्योंकि जब इंटरैक्टिव रूप से चल रहा है, कक्षा की जानकारी वैश्विक पर्यावरण में संग्रहीत की जा रही है, जो लॉक नहीं है, जबकि मेरे पैकेज का मूल वातावरण लॉक है।

मैं तो एक धागा है कि प्रभाव से कुछ का उपयोग कर सुझाव पाया:

myClass <- setRefClass("NewClassName", fields=list(fieldA="character"), where=globalenv()) 

यह वास्तव में आर/स्टूडियो दुर्घटनाग्रस्त हो गया जब मैं पैकेज का निर्माण करने की कोशिश की, तो मैं त्रुटि का एक लॉग की जरूरत नहीं है दुर्भाग्यवश, यह उत्पन्न हुआ, लेकिन यह निश्चित रूप से काम नहीं किया।

अगला मैंने अपने पैकेज के भीतर एक नया वातावरण बनाने की कोशिश की जिसे मैं इन संदर्भ वर्गों को स्टोर करने के लिए उपयोग कर सकता था। तो मैं अपने पैकेज स्रोतों में (नहीं किसी भी समारोह के अंदर) एक .classEnv <- new.env() लाइन जोड़ा और फिर जब एक नया संदर्भ वर्ग बनाने इस वर्ग का उपयोग करने का प्रयास किया:

myClass <- setRefClass("NewClassName", fields=list(fieldA="character"), where=.classEnv) 

यह वास्तव में ठीक काम करने के लिए लग रहा था, लेकिन निम्न चेतावनी उत्पन्न करता है :

> myClass <- setRefClass("NewClassName", where=.classEnv) 
Warning message: 
In getPackageName(where) : 
    Created a package name, ‘2013-04-23 10:19:14’, when none found 

तो, किसी कारण से, methods::getPackageName() नहीं लेने के लिए जो पैकेज अपने नए वातावरण में है में सक्षम है?

क्या मेरा नया वातावरण अलग-अलग बनाने का कोई तरीका है ताकि getPackageName() पैकेज को सही तरीके से पहचान सके? क्या मैं कुछ फीचर जोड़ सकता हूं जो मुझे getPackageName() पैकेज का पता लगाने में मदद करता है? क्या यह भी काम करेगा यदि मैं चेतावनी से निपट सकता हूं, या क्या मैं गतिशील रूप से उन्हें बनाने की कोशिश करके संदर्भ कक्षाओं का दुरुपयोग कर रहा हूं?

+0

'? SetRefClass' कहता है कि तर्क '...' 'setClass' को पास कर दिया गया है, और इसमें तर्क' पैकेज' है; क्या आप तर्क 'पैकेज =' YourPackage 'या कुछ के साथ अपना तीसरा दृष्टिकोण लेना चाहते हैं? –

+0

टिप, मार्टिन के लिए धन्यवाद। दुर्भाग्य से, वह त्रुटि को हटाने में सक्षम नहीं था। ऐसा लगता है कि पैकेज नाम 'getPackageName' तक नीचे तक नहीं निकलता है, जहां' .packageName' चर पहले से निर्दिष्ट नहीं किया गया है, तो चेतावनी तब से आती है। –

उत्तर

5

बातचीत करने के लिए, मैंने पाया कि getpackageName निर्दिष्ट वातावरण में एक छिपे हुए .packageName चर में पैकेज का नाम संग्रहीत करता है।

तो आप वास्तव में

assign(".packageName", "MyPkg", envir=.classEnv)  
myClass <- setRefClass("NewClassName", fields=classFields, where=.classEnv) 

जो चेतावनी का समाधान करता है के साथ चेतावनी आसपास पहुंच सकते हैं, लेकिन प्रलेखन अनिश्चित काल के लिए .packageName चर पर विश्वास नहीं करने का कहना है, और मैं अभी भी और हो सकता है लगता है कि मैं इस हैकिंग कर रहा हूँ संदर्भ कक्षाओं और पर्यावरण से उनके संबंधों के बारे में कुछ महत्वपूर्ण समझना गलत हो। दस्तावेज़ से

पूर्ण विवरण:

पैकेज का नाम सामान्य रूप से पैकेज लोड करने में स्थापित कर रहे हैं, इन्सटाल स्क्रिप्ट के द्वारा या पुस्तकालय समारोह से। (वर्तमान में, नाम ऑब्जेक्ट के रूप में संग्रहीत है .packageName लेकिन भविष्य के लिए इस पर भरोसा न करें।)


संपादित:

थोड़ा और आगे पढ़ने के बाद, setPackageName विधि पर्यावरण के लिए पैकेज का नाम स्थापित करने के लिए एक और अधिक विश्वसनीय तरीका हो सकता है। दस्तावेज़ों के अनुसार:

setPackageName का उपयोग किसी ऐसे वातावरण में पैकेज नाम स्थापित करने के लिए किया जा सकता है जो अन्यथा नहीं होगा। यह आपको एक मनमाना वातावरण में कक्षाओं और/या तरीकों बनाने की अनुमति देता है, लेकिन यह मानक आर प्रोग्रामिंग उपकरणों (package.skeleton, आदि) द्वारा संकुल बनाने के लिए आम तौर पर बेहतर है

तो यह एक मान्य समाधान की तरह दिखता है

setPackageName("MyPkg", .classEnv) 
myClass <- setRefClass("NewClassName", fields=classFields, where=.classEnv) 

चेतावनी संदेश निकल जाते हैं और कुछ भी है कि अस्थिर रूप में दस्तावेज़ीकरण किया गया है पर निर्भर नहीं करता है कि: निम्नलिखित होगा। मैं अभी भी स्पष्ट नहीं हूं कि यह क्यों जरूरी है, लेकिन ...

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