इस प्रश्न में बहुत सारे चल रहे हिस्सों हैं। विभिन्न भागों के लिए प्रलेखन के माध्यम से खुदाई, मुझे लगता है कि आप लाइन है कि तोड़ दिया पर ऐसा करने की जरूरत:
gesinstance = .jnew("edu/cmu/tetrad/search/Ges", .jcast(dataset, "edu/cmu/tetrad/data/DataSet"))
मुख्य अंतर यह दूसरा तर्क पर .jcast
करने के लिए कॉल किया जा रहा है। (मेरे पास आर इंस्टॉल नहीं है, इसलिए मैं इसका परीक्षण नहीं कर सका - अगर यह काम नहीं करता है, तो मैं अपने त्रुटि को नए त्रुटि संदेशों पर प्रदान की जा सकने वाली किसी भी प्रतिक्रिया के आधार पर अपडेट कर दूंगा।)
तो सवाल यह है कि "यह क्यों?" इस सवाल का जवाब हो रहा है:
- जावा तरफ,
DataReader.parseTabularData
प्रकार DataSet
के साथ एक वस्तु के रूप में आप का उल्लेख किया दिखाए, लेकिन DataSet
एक इंटरफेस नहीं एक वर्ग है। इसका जरूरी अर्थ यह है कि वास्तविक वस्तु लौटाई गई कुछ कक्षा है जो DataSet
इंटरफ़ेस लागू करती है।
- उन कारणों के लिए जो मुझे तुरंत स्पष्ट नहीं हैं, आरजेएवी पैकेज वास्तव में पॉलिमॉर्फिज्म को अच्छी तरह से संभाल नहीं करता है। यह आवश्यक है कि आप उन वस्तुओं को "सटीक" हस्ताक्षर मिलान के साथ विधियों को कॉल करें जिन्हें आप पास कर रहे हैं। इस मामले में, आपको इंटरफेस
DataSet
पर जो भी विशिष्ट वर्ग मिला है, उससे आपको "अप-कास्ट" करने की आवश्यकता होगी। .jnew
(https://www.rforge.net/doc/packages/rJava/html/jnew.html) के लिए प्रलेखन देखें, खासकर उन तर्कों के लिए जिन्हें वे "..." द्वारा दर्शाते हैं। यह आपको .jcall
(https://www.rforge.net/doc/packages/rJava/html/jcall.html) के लिए प्रलेखन के संबंधित भाग को संदर्भित करता है, फिर कुछ उदाहरणों के साथ .jcast
(https://www.rforge.net/doc/packages/rJava/html/jcast.html) पर कॉल करने की आवश्यकता बताता है।
आपको मिली त्रुटि जो आपको मिली है java.lang.NoSuchMethodError: <init>
आपको बता रहा था कि JVM आपके द्वारा बुलाए गए निर्माता को नहीं ढूंढ सका। उदाहरण के लिए यह रहस्यमय दिख रहा था कि आपने टिप्पणियों में पोस्ट किया था। (वैसे भी, अपने प्रश्न को संपादित करना अच्छा हो सकता है, और उस जानकारी को पोस्टरिटी के लिए वहां शामिल कर सकते हैं।) कोड निश्चित रूप से सही दिखता है, और, जावा को जानकर, मैंने सहजता से जावा के बहुरूपता का सम्मान करने के लिए इंटरफ़ेस की अपेक्षा की। यह देखते हुए कि (जो भी कारण है), इंटरफ़ेस आर के लिए विरासत पर विचार किए बिना "सटीक" प्रकार मिलान करता है, यह स्पष्ट है कि इसे उपरोक्त कारण # 1 के कारण कोई कन्स्ट्रक्टर नहीं मिलेगा।
अंततः, मुझे वास्तव में टेट्रैड की सीमित खोज में जेनरिक का उपयोग करके किसी भी जावा कक्षा का सामना नहीं करना पड़ा। जैसा कि यह पता चला है, हालांकि यह एक पूर्ण लाल हेरिंग था। अगर भविष्य में यह एक मुद्दा हो, तो आप शायद "टाइप एरर" (https://docs.oracle.com/javase/tutorial/java/generics/erasure.html) देखना चाहेंगे। यदि आप जावा और सी, सी ++, फोरट्रान के बीच इंटरफेसिंग कर रहे थे, तो जावा किसी भी भाषा को "देशी" मानती है, तो आप टाइप-मिस्ड फॉर्मों में काम करके मूल कोड में जेनेरिक से निपटेंगे। हालांकि, आरजेएवी इंटरफ़ेस अलग-अलग हो सकता है, क्योंकि ऐसा लगता है कि यह सामान्य प्रकार की संरचना में पड़ता है जो आपको आपकी वर्तमान समस्या पर ले जाता है। (शायद बाद में अपने बक्षीस के योग्य!)
जब आप '.jnew()' कॉल करते हैं तो आप किस सटीक वाक्यविन्यास का उपयोग कर रहे हैं? क्या आप इसे तर्क दे रहे हैं?कृपया उन्हें बिल्कुल निर्दिष्ट करें। – Brick
यहां एक काम किया उदाहरण है। आपको [यहां] (http://www.phil.cmu.edu/projects/tetrad_download/download/tetrad-5.2.1-3.jar) (1 9 एमबी) और नमूना डेटासेट से टेट्रैड जार डाउनलोड करने की आवश्यकता होगी, charity.txt, [यहां] से (http://www.phil.cmu.edu/projects/tetrad_download/download/workshop/Data/charity.txt)। आर में सेट करें: 'setwd ("कहीं भी/आप/put/the/data /") ' ' लाइब्रेरी (आरजेवा)', '.jinit (" पथ/से/tetrad-5.2.1-3.jar ")'। निम्नलिखित सभी कार्य: 1. 'filename = .jnew (" जावा/लैंग/स्ट्रिंग "," charity.txt ")', 2. 'datafile = .jnew (" जावा/io/फ़ाइल ", फ़ाइल नाम)', 3. 'पाठक = .jnew (" edu/cmu/tetrad/data/dataReader ")', –
4. 'delim = J (" edu/cmu/tetrad/data/DelimiterType ")', 5. पाठक $ setDelimiter ($ TAB delim '', 6.' डेटासेट = पाठक $ parseTabular (datafile) '। लेकिन निम्नलिखित काम नहीं करता है: 7. 'gesinstance = .jnew ("edu/cmu/tetrad/search/ges", डेटासेट) '। पाठक $ parseTabular डेटासेट देता है, और जीएस क्लास डेटासेट तर्क के साथ बनाया जाना चाहिए। दुर्भाग्य से यह काम नहीं करता है। मुझे लगता है कि कारण यह है क्योंकि जीस दो इंटरफेस, ग्राफशर्च और ग्राफ़स्कोरर लागू करता है, और ग्राफ़स्कोरर केवल एक डबल है। जावा स्रोत में: 'सार्वजनिक इंटरफ़ेस GraphScorer { डबल स्कोरडाग (ग्राफ़ डैग); } ' –