2011-03-21 18 views
20

Necesito conectar R a alguna aplicación C#. Instalé rscproxy_1.3 y R_Scilab_DCOM3.0-1B5 añadí referencias COM al STATCONNECTORCLNTLib, StatConnectorCommonLib y STATCONNECTORSRVLib pero todavía no puedo hacer que funcione.C# - Interfaz R

cuando corro siguiente programa de prueba:

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

me sale esta excepción:

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

Gracias de antemano.

ACTUALIZACIÓN: Ok, todavía no hubo suerte. Trataré de explicar lo que hice hasta ahora.

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 viene una prueba básica. Traté de correr, pero llegué siguiente error:

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

De lo que miraba en las variables de ruta/del sistema y no encontró ninguna ruta/R_HOME/R_USER información. Además, no pude encontrar nada relacionado con R en el registro.

Supongo que estoy haciendo algo terriblemente malo, por lo que necesito desesperadamente ayuda de ustedes.

+1

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

Respuesta

11

Ok, he resuelto finalmente. El problema es que R (D) Com no funciona con la versión actual de R. Instalé 2.11.1 y funcionó fuera de la caja.

Muchas gracias.

+0

No pude conseguir que funcione con R v2.11.1 x64 (¿quizás necesito instalar la versión x32?). – Contango

4

De 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

Gracias por la respuesta, pero aún nada. Puse rscproxy.dll en C: \ Archivos de programa \ R \ R-2.12.2 \ bin \ rscproxy, pero sigo recibiendo 80040013, las variables de entorno están configuradas correctamente. ¿Cualquier otra sugerencia? – Klark

+0

Klark: ¿Está instalado 'rscproxy' en la ubicación de biblioteca predeterminada (' R_HOME/library/rscproxy')? Me parece recordar que se rompe si usa un 'R_LIBRARY' personalizado. –

+0

sí lo es. Actualizo mi pregunta Por favor échale un vistazo. Gracias – Klark

15

Puede echar un vistazo a R.NET, por otro enfoque ...

+0

Tengo R.NET trabajando bajo VS2012, con R 2.11.1 x32. Funcionó cuando se compiló para "x32" y "Toda la CPU" (consulte "Administrador de configuración"). No funcionó cuando se apuntó a R 2.11.1 x64 ("DLL no se encontró"). – Contango

+0

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

8

Use R.NET (instalé el mío de NuGet) y el siguiente código en una nueva aplicación de consola C# (que se copió con cambios menores desde http://rdotnet.codeplex.com/).

que funcionará cuando señalado en la versión de 32 bits de R v2.11.1, pero voluntad no trabajo cuando señalado en la versión de 64 bits de R v2.11.1 (como se indica en el código de abajo).

Cuando instalé NuGet, automáticamente agregó referencias al proyecto actual: RDotNet (RDotNet.dll) y RDotNet.NativeLIbrary (RDotNet.NativeLibrary.dll). Necesitará estas referencias en cualquier proyecto nuevo.

Funciona en VS2012 (no probado bajo VS2010, pero probablemente funcionará).

Funciona cuando se compila para "x32" y "Toda la CPU" (en "Build..Configuration Manager" en 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

Prefiero R.NET al enfoque R (D) COM. ¿"No funciona" en los escenarios de x64 debido a la falta de coincidencia de los objetivos de arquitectura para los componentes involucrados? Con las nuevas versiones de R.NET (1.6) no necesita establecer la ruta en su código C#; el método R.NET Initialize encuentra la instalación R en su máquina. Sin embargo, para una aplicación MVC, VS2013 NET 4.51 con un objetivo de cualquier CPU, necesitaba configurar la ruta del sistema para que apuntara a 32 bits R C: \ Program Files \ R \ R-3.1.0 \ bin \ i386. Anexando a la ruta, la R C de 64 bits: \ Archivos de programa \ R \ R-3.1.0 \ bin \ x64 dio como resultado un error que indicaba funciones de invocación de problemas en el R.dll. – subsci

+0

@subsci Totalmente de acuerdo, R.NET es mucho mejor que R (D) COM, simplemente funciona. – 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

Solución: [Por cierto, tengo R, rstudio, Revolución R en mi PC]

1.Instalar el programas y paquetes necesarios:
Para realizar exponencial suavizado en Eviews (7.2), se necesitan complementos ExpSmooth.
Para que los complementos ExpSmooth funcionen correctamente, el programa R y los paquetes previstos y rscproxy deben estar instalados; y statconnDCOM debe estar instalado.

2.poner los archivos y carpetas a los lugares BIN y biblioteca correcta:
Copiar y pegar el archivo rscproxy.dll a las carpetas C:\Program Files\R\R-2.15.3\bin y C:\Revolution\R-Enterprise-6.1\R-2.14.2\bin.
Coloque la carpeta rscproxy en el archivo rscproxy_2.0-5.zip en las carpetas C:\Revolution\R-Enterprise-6.1\R-2.14.2\library y C:\Program Files\R\R-2.15.3\library.

3.Otros detalles:
no hice ningún cambio en las variables de entorno para superar el problema en cuestión.
Había establecido algunas variables de entorno por primera vez cuando instalé R y Revolution R así (esta configuración es irrelavante con el contexto aquí):
Variables del sistema - Ruta: C: \ Rtools \ bin; C: \ Archivos de programa \ R \ R-3.0.2 \ bin \ i386; C: \ Rtools \ gcc-4.6.3 \ bin;
(le ofrezco configurar la versión R que instaló y usó).
Ejecute Server 01 – Basic Test que existía al instalar statconnDCOM: Inicio - statconn - DCOM - "Servidor 01 - Prueba básica".
Presione para R.
statconnDCOM funcionó.

3

A continuación, se indica cómo llamar a una función R personalizada desde un archivo Rdata (no solo una función R incorporada). En realidad, esto es lo que funcionó para mí. Para que funcione StatConnectorClass, tuve que abrir las propiedades de StatConnectorsRVLib y establecer 'Incrustar tipos de interoperabilidad' en 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(); 
      } 

Hope this helps!