2011-03-21 13 views
20

मुझे कुछ सी # एप्लिकेशन में आर इंटरफ़ेस करने की आवश्यकता है। मैंने rscproxy_1.3 और R_Scilab_DCOM3.0-1B5 को STATCONNECTORCLNTLib, StatConnectorCommonLib और STATCONNECTORSRVLib पर COM संदर्भों को जोड़ा लेकिन मैं अभी भी इसे काम नहीं कर सकता।सी # - आर इंटरफ़ेस

जब मैं परीक्षण कार्यक्रम निम्नलिखित चलाएँ:

Unhandled Exception: System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x80040013 
    at STATCONNECTORSRVLib.StatConnectorClass.Init(String bstrConnectorName) 

अग्रिम धन्यवाद:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

//COM references 
using STATCONNECTORCLNTLib; 
using StatConnectorCommonLib; 
using STATCONNECTORSRVLib; 

namespace R_TESTING 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      StatConnector sc1 = new STATCONNECTORSRVLib.StatConnectorClass();   
      sc1.Init("R"); 
     } 
    } 
} 

मैं इस अपवाद मिलता है।

अद्यतन: ठीक है, अभी भी कोई भाग्य नहीं है। मैं यह बताने की कोशिश करूंगा कि मैंने अभी तक क्या किया है।

Installed R-2.12.2-win.exe from rproject to the C:\Program Files\R\R-2.12.2

Downloaded rscproxy_1.3-1.zip and copy/pasted it to the C:\Program Files\R\R-2.12.2\library

Installed R_Scilab_DCOM3.0-1B5.exe to the C:\Program Files (x86)\R\(D)COM Server

साइलैब के साथ एक बुनियादी परीक्षण आता है। मैं इसे चलाने के लिए कोशिश की, लेकिन मैं त्रुटि निम्न है:

Loading StatConnector Server... Done Initializing R...Function call failed Code: -2147221485 Text: installation problem: unable to load connector Releasing StatConnector Server...Done

से मैं पथ/प्रणाली चर में देखा और कोई रास्ता/R_HOME/R_USER की जानकारी नहीं मिली। इसके अलावा, मुझे रजिस्ट्री में संबंधित आर कुछ भी नहीं मिला।

मुझे लगता है कि मैं कुछ गलत कर रहा हूं, इसलिए मुझे आपके लोगों से बहुत मदद की ज़रूरत है।

+1

देखें http://stackoverflow.com/questions/12834704/exception-from-hresult-0x80040013-when-intregating-r-with-c – Contango

उत्तर

11

ठीक है, मैं यह अंत में हल किया। समस्या यह है कि आर (डी) कॉम आर के मौजूदा संस्करण के साथ काम नहीं करता है। मैंने 2.11.1 स्थापित किया और यह बॉक्स से बाहर काम किया।

बहुत बहुत धन्यवाद।

+0

मैं इसे आर v2.11.1 x64 (शायद मुझे x32 संस्करण स्थापित करने की आवश्यकता है) के साथ काम करने के लिए नहीं मिल सका। – Contango

4

here से:

I think I just remembered how to solve the 80040013 exception. I think it had to do with the fact that my install of the R files did not include a rscproxy.dll. Somewhere along the way, R changed from using a dll named (I think) proxy.dll and started using one called rscproxy.dll. You have to find and download rscproxy.dll to the R\bin folder.

If that doesn't work, check your environment variables to be sure they R_HOME and R_USER values are pointing to the R\bin folder. Make sure the R (D)Com objects are properly registered with Windows.

+0

उत्तर के लिए धन्यवाद, लेकिन अभी भी कुछ नहीं। मैंने rscproxy.dll को C: \ Program Files \ R \ R-2.12.2 \ bin \ rscproxy में रखा है, लेकिन मुझे अभी भी 80040013 मिलते हैं, पर्यावरण चर ठीक से स्थापित होते हैं। कोई अन्य सुझाव? – Klark

+0

क्लर्क: क्या डिफ़ॉल्ट पुस्तकालय स्थान ('R_HOME/लाइब्रेरी/rscproxy') में' rscproxy' स्थापित है? मुझे याद है कि यदि आप कस्टम 'R_LIBRARY' का उपयोग करते हैं तो यह टूट जाता है। –

+0

हाँ यह है। मैं अपना प्रश्न अपडेट करता हूं। कृपया एक नज़र डालें। धन्यवाद – Klark

15

आप किसी अन्य दृष्टिकोण के लिए R.NET पर एक नज़र, हो सकता है ...

+0

मुझे आर 2.1ET आर 2.11 के तहत काम कर रहा है, आर 2.11.1 x32 के साथ। यह "x32" और "सभी CPU" के लिए संकलित होने पर काम करता है (देखें "कॉन्फ़िगरेशन प्रबंधक")। आर 2.11.1 x64 ("डीएलएल नहीं मिला") पर इंगित करते समय यह काम नहीं किया। गिटहब पर – Contango

+0

आर.Net: https: // github।com/jmp75/rdotnet – user2341923

8

R.NET (मैंने NuGet से मेरा स्थापित किया) और निम्न कोड को एक नए सी # कंसोल ऐप में उपयोग किया है (जिसे http://rdotnet.codeplex.com/ से मामूली परिवर्तनों के साथ कॉपी किया गया था) का उपयोग करें।

यह जब आर v2.11.1 के 32-बिट संस्करण की दिशा में रखे प्राप्त होगा, लेकिन यह नहीं होगा काम जब आर v2.11.1 के 64-बिट संस्करण की दिशा में रखे (के रूप में नीचे दिए गए कोड में बताया गया है)।

जब मैंने NuGet स्थापित किया, तो यह स्वचालित रूप से वर्तमान प्रोजेक्ट के संदर्भों को जोड़ा गया: RDotNet (RDotNet.dll) और RDotNet.NativeLIbrary (RDotNet.NativeLibrary.dll)। आपको किसी भी नई परियोजना में इन संदर्भों की आवश्यकता होगी।

वीएस2012 के तहत काम करता है (वीएस -2010 के तहत अनचाहे, लेकिन शायद काम करेगा)।

"x32" और "सभी CPU" दोनों के लिए संकलित किए जाने पर काम करता है (VS2012 में "Build..Configuration Manager" के अंतर्गत)।

// Call R from .NET. Advantage is that everything is in process. 
// Tested on VS2012, will probably work on VS2010. 
using System; 
using System.IO; 
using System.Linq; 
using RDotNet; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     // Set the folder in which R.dll locates. 
     var envPath = Environment.GetEnvironmentVariable("PATH"); 
     var rBinPath = @"C:\Program Files (x86)\R\R-2.11.1\bin"; 
     //var rBinPath = @"C:\Program Files\R\R-2.11.1-x64\bin"; // Doesn't work ("DLL was not found.") 
     Environment.SetEnvironmentVariable("PATH", envPath + Path.PathSeparator + rBinPath); 
     using (REngine engine = REngine.CreateInstance("RDotNet")) 
     { 
      // Initializes settings. 
      engine.Initialize(); 

      // .NET Framework array to R vector. 
      NumericVector group1 = engine.CreateNumericVector(new double[] { 30.02, 29.99, 30.11, 29.97, 30.01, 29.99 }); 
      engine.SetSymbol("group1", group1); 
      // Direct parsing from R script. 
      NumericVector group2 = engine.Evaluate("group2 <- c(29.89, 29.93, 29.72, 29.98, 30.02, 29.98)").AsNumeric(); 

      // Test difference of mean and get the P-value. 
      GenericVector testResult = engine.Evaluate("t.test(group1, group2)").AsList(); 
      double p = testResult["p.value"].AsNumeric().First(); 

      Console.WriteLine("Group1: [{0}]", string.Join(", ", group1)); 
      Console.WriteLine("Group2: [{0}]", string.Join(", ", group2)); 
      Console.WriteLine("P-value = {0:0.000}", p); 
     } 
    } 
} 
+0

मैं आर (डी) COM दृष्टिकोण के लिए आरएनईटी पसंद करता हूं। क्या यह x64 परिदृश्यों के तहत "काम नहीं करता" क्योंकि घटकों के लिए आर्किटेक्चर लक्ष्यों के मेल नहीं खाते हैं? R.NET (1.6) के नए संस्करणों के साथ आपको अपने सी # कोड में पथ सेट करने की आवश्यकता नहीं है; R.NET प्रारंभिक विधि को आपकी मशीन पर आर-इंस्टॉल मिलती है। हालांकि किसी भी सीपीयू के लक्ष्य के साथ एक एमवीसी ऐप, वीएस2013 नेट 4.51 के लिए, मुझे 32 बिट आर सी: \ प्रोग्राम फ़ाइलें \ R \ R-3.1.0 \ bin \ i386 पर इंगित करने के लिए सिस्टम पथ सेट करने की आवश्यकता थी। पथ में शामिल होने पर, 64 बिट आर सी: \ प्रोग्राम फ़ाइलें \ R \ R-3.1.0 \ bin \ x64 के परिणामस्वरूप एक त्रुटि हुई जो R.dll में फ़ंक्शंस फ़ोकस करने वाली समस्या का संकेत देती है। – subsci

+0

@subsci पूरी तरह से सहमत हैं, आर.नेट आर (डी) COM से काफी बेहतर है, यह सिर्फ काम करता है। – Contango

3

समस्या:

Loading StatConnector Server... Done Initializing R...Function call failed Code: -2147221485 Text: installation problem: unable to load connector Releasing StatConnector Server...Done

समाधान: [वैसे, मैं अपने पीसी में आर, RStudio, क्रांति आर है]

1.स्थापित करें आवश्यक कार्यक्रम और पैकेज:
घातीय प्रदर्शन करने के लिए साक्षात्कार में चिकनाई (7.2), एक्सपसमथ ऐड-इन्स आवश्यक है।
एक्सपसमुथ ऐड-इन्स ठीक से काम करने के लिए, प्रोग्राम आर, और संकुल पूर्वानुमान और rscproxy स्थापित होना चाहिए; और statconnDCOM स्थापित होना चाहिए।

2.सही बिन और लाइब्रेरी स्थानों के लिए फ़ाइलों और फ़ोल्डरों रखो:
कॉपी-पेस्ट C:\Program Files\R\R-2.15.3\bin और C:\Revolution\R-Enterprise-6.1\R-2.14.2\bin फ़ोल्डर में फ़ाइल rscproxy.dll।
rscproxy_2 rscproxy_2.0-5.zip फ़ाइल में C:\Revolution\R-Enterprise-6.1\R-2.14.2\library और C:\Program Files\R\R-2.15.3\library फ़ोल्डर्स में rscproxy फ़ोल्डर रखें।

3.अतिरिक्त जानकारी:
मैं प्रश्न में समस्या को दूर करने वातावरण चर में कोई परिवर्तन नहीं किया।
मैंने पहली बार कुछ पर्यावरण चर सेट किए थे जब मैंने आर और क्रांति आर को स्थापित किया था (यह सेटिंग यहां संदर्भ के साथ असंभव है):
सिस्टम चर - पथ: सी: \ Rtools \ bin; C: \ कार्यक्रम फ़ाइलें \ R \ R-3.0.2 \ bin \ i386; सी: \ Rtools \ gcc-4.6.3 \ bin;
(मैं आपको आर संस्करण स्थापित करने और ऑफ़र करने के लिए ऑफ़र करता हूं)।
रन Server 01 – Basic Test जो statconnDCOM इंस्टॉल करने पर मौजूद था: प्रारंभ - statconn - DCOM - "सर्वर 01 - मूल परीक्षण"।
आर
statconnDCOM पर काम किया।

3

यहां एक Rdata फ़ाइल से कस्टम आर फ़ंक्शन को कॉल करने का तरीका बताया गया है (न केवल एक अंतर्निहित आर फ़ंक्शन)। दरअसल यह मेरे लिए काम करता है। StatConnectorClass काम करने के लिए, मुझे StatConnectorsRVLib के गुणों को खोलना पड़ा और गलत एम्बेड करने के लिए 'एम्बेड इंटरप प्रकार' सेट करना पड़ा।

using StatConnectorCommonLib; 
using STATCONNECTORSRVLib; 
using STATCONNECTORCLNTLib; 

StatConnectorClass rConn = new StatConnectorClass(); 
      try 
      { 
       rConn.Init("R"); // here is where we initialize R 
       Response.Write("Initialized." + "<br />"); Response.Flush(); 
       Response.Write("1" + "<br />"); Response.Flush(); 
       string path = @"C:SOMEPATH\Black-Scholes.RData"; 
       rConn.SetSymbol("path", path); 
       Response.Write("2" + "<br />"); Response.Flush(); 
       rConn.Evaluate("load(path)"); 
       Response.Write("3" + "<br />"); Response.Flush(); 
       Int16 entry = 27; 
       rConn.SetSymbol("n1", entry); 
       Response.Write("6" + "<br />"); Response.Flush(); 
       rConn.Evaluate("x1<-samplefn(n1)"); 
       Response.Write("Entered : " + entry.ToString() + "<br/> "); 
       Object o = rConn.GetSymbol("x1"); 
       Response.Write("Ans:" + o.ToString() + "<br />"); Response.Flush(); 
       rConn.Close(); 
      } 
      catch (Exception ex) 
      { 
       Response.Write("Error: " + ex.Message);//+ " xx " + rConn.GetErrorText()); 
       rConn.Close(); 
      } 

आशा है कि इससे मदद मिलती है!

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