2011-03-21 17 views
20

Ho bisogno di interfacciare R con alcune applicazioni C#. Ho installato rscproxy_1.3 e R_Scilab_DCOM3.0-1B5 aggiunto riferimenti COM allo STATCONNECTORCLNTLib, StatConnectorCommonLib e STATCONNECTORSRVLib ma non riesco ancora a farlo funzionare.C# - Interfaccia R

quando ho eseguito seguente programma di test:

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"); 
     } 
    } 
} 

ottengo questa eccezione:

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

Grazie in anticipo.

UPDATE: Ok, ancora senza fortuna. Proverò a spiegare quello che ho fatto finora.

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

Con Scilab arriva un test di base. Ho provato a farlo funzionare, ma ho ottenuto seguente errore:

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

Than ho guardato negli Variabili di percorso/di sistema e ho trovato nessun percorso informazioni/R_HOME/R_USER. Inoltre, non sono riuscito a trovare nulla di R correlato nel registro.

Credo di fare qualcosa di terribilmente sbagliato, quindi ho disperatamente bisogno di aiuto da voi ragazzi.

+1

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

risposta

11

Ok, ho risolto finalmente. Il problema è che R (D) Com non funziona con la versione attuale di R. Ho installato 2.11.1 e ha funzionato fuori dagli schemi.

Grazie mille.

+0

Non riuscivo a farlo funzionare con R v2.11.1 x64 (forse ho bisogno di installare la versione x32?). – Contango

4

Da 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

Grazie per la risposta, ma ancora nulla. Ho inserito rscproxy.dll in C: \ Programmi \ R \ R-2.12.2 \ bin \ rscproxy, ma ottengo ancora 80040013, Le variabili di ambiente sono configurate correttamente. Qualche altro suggerimento? – Klark

+0

Klark: 'rscproxy' è installato nel percorso della libreria di default (' R_HOME/library/rscproxy')? Mi sembra di ricordare che si interrompe se usi un custom 'R_LIBRARY'. –

+0

sì, lo è. Aggiorno la mia domanda Per favore guarda. Grazie – Klark

15

Si può avere uno sguardo a R.NET, per un altro approccio ...

+0

Ho ottenuto R.NET lavorando sotto VS2012, con R 2.11.1 x32. Ha funzionato quando compilato per "x32" e "Tutte le CPU" (vedere "Configuration Manager"). Non ha funzionato quando puntato su R 2.11.1 x64 ("DLL non trovata"). – Contango

+0

R.Net su GitHub: https: // github.com/jmp75/rdotnet – user2341923

8

Utilizzare R.NET (ho installato il mio da NuGet) e il seguente codice in una nuova app di console C# (che è stata copiata con modifiche minori da http://rdotnet.codeplex.com/).

Funzionerà quando puntato sulla versione a 32 bit di R v2.11.1, ma il non sarà funzionante quando è puntato sulla versione a 64 bit di R v2.11.1 (come indicato nel seguente codice).

Quando ho installato NuGet, ha aggiunto automaticamente riferimenti al progetto corrente: RDotNet (RDotNet.dll) e RDotNet.NativeLIbrary (RDotNet.NativeLibrary.dll). Avrai bisogno di questi riferimenti in ogni nuovo progetto.

Funziona in VS2012 (non testato con VS2010, ma probabilmente funzionerà).

Funziona quando è compilato per "x32" e "Tutte CPU" (in "Build..Configuration Manager" in VS2012).

// 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

Preferisco R.NET all'approccio COM R (D). Non "funziona" in scenari x64 a causa della mancata corrispondenza dei target di architettura per i componenti coinvolti? Con le nuove versioni di R.NET (1.6) non è necessario impostare il percorso nel codice C#; il metodo R.NET Initialize trova l'installazione R sulla tua macchina. Tuttavia, per un'app MVC, VS2013 NET 4.51 con una destinazione di qualsiasi CPU, avevo bisogno di impostare il percorso di sistema in modo che puntasse a 32 bit R C: \ Programmi \ R \ R-3.1.0 \ bin \ i386. Aggiungendo al percorso, il file C: \ Programmi \ R \ R-3.1.0 \ bin \ x64 a 64 bit ha provocato un errore che indica il problema durante il richiamo delle funzioni in R.dll. – subsci

+0

@subsci Totalmente d'accordo, R.NET è molto meglio di R (D) COM, funziona solo. – Contango

3

Problema:

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

Soluzione: [A proposito, ho R, RStudio, Revolution R nel mio PC]

1.Installare il programmi e pacchetti necessari:
Per l'esecuzione esponenziale smoothing in Eviews (7.2), sono necessari i componenti aggiuntivi di ExpSmooth.
Per far funzionare correttamente i componenti aggiuntivi di ExpSmooth, è necessario installare il programma R e la previsione dei pacchetti e rscproxy; e deve essere installato statconnDCOM.

2.mettere i file e le cartelle per il corretto BIN e biblioteca posizioni:
copia-incolla del file rscproxy.dll alle cartelle C:\Program Files\R\R-2.15.3\bin e C:\Revolution\R-Enterprise-6.1\R-2.14.2\bin.
Inserire la cartella rscproxy nel file rscproxy_2.0-5.zip nelle cartelle C:\Revolution\R-Enterprise-6.1\R-2.14.2\library e C:\Program Files\R\R-2.15.3\library.

3.Ulteriori informazioni:
non ho fatto alcuna modifica alle variabili di ambiente per superare il problema in questione.
Ho impostato alcune variabili di ambiente per la prima volta quando ho installato R e Revolution R in questo modo (questa impostazione è irrilevante con il contesto qui):
Variabili di sistema - Percorso: C: \ Rtools \ bin; C: \ Programmi \ R \ R-3.0.2 \ bin \ i386; C: \ Rtools \ gcc-4.6.3 \ bin;
(Vi offro di impostare la versione R installata e utilizzata).
Eseguire Server 01 – Basic Test che esisteva al momento dell'installazione di statconnDCOM: Start - statconn - DCOM - "Server 01 - Test di base".
Premere per R.
statconnDCOM ha funzionato.

3

Ecco come chiamare una funzione R personalizzata da un file Rdata (non solo una funzione R incorporata). In realtà questo è quello che ha funzionato per me. Per far funzionare StatConnectorClass, ho dovuto aprire le proprietà per StatConnectorsRVLib e impostare 'Incorpora tipi di interoperabilità' su False.

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(); 
      } 

Spero che questo aiuti!