मैं फ्लाई पर एक आर पैकेज के भीतर संदर्भ कक्षाएं उत्पन्न करने का प्रयास कर रहा हूं, और यह काफी मुश्किल साबित हो रहा है। यहां मैंने जो दृष्टिकोण उठाए हैं और जिन समस्याओं में मैंने भाग लिया है:गतिशील रूप से संदर्भ कक्षाएं उत्पन्न करें
मैं एक पैकेज बना रहा हूं जिसमें मुझे स्कीमा में गतिशील रूप से पढ़ने में सक्षम होने की उम्मीद है और स्वचालित रूप से एक संबंधित संदर्भ वर्ग उत्पन्न करें (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()
पैकेज का पता लगाने में मदद करता है? क्या यह भी काम करेगा यदि मैं चेतावनी से निपट सकता हूं, या क्या मैं गतिशील रूप से उन्हें बनाने की कोशिश करके संदर्भ कक्षाओं का दुरुपयोग कर रहा हूं?
'? SetRefClass' कहता है कि तर्क '...' 'setClass' को पास कर दिया गया है, और इसमें तर्क' पैकेज' है; क्या आप तर्क 'पैकेज =' YourPackage 'या कुछ के साथ अपना तीसरा दृष्टिकोण लेना चाहते हैं? –
टिप, मार्टिन के लिए धन्यवाद। दुर्भाग्य से, वह त्रुटि को हटाने में सक्षम नहीं था। ऐसा लगता है कि पैकेज नाम 'getPackageName' तक नीचे तक नहीं निकलता है, जहां' .packageName' चर पहले से निर्दिष्ट नहीं किया गया है, तो चेतावनी तब से आती है। –