2011-03-21 9 views
20

Potrzebuję interfejs R do niektórych aplikacji C#. Zainstalowałem rscproxy_1.3 i R_Scilab_DCOM3.0-1B5 dodane odniesienia COM do STATCONNECTORCLNTLib, StatConnectorCommonLib i STATCONNECTORSRVLib, ale nadal nie mogę go uruchomić.Interfejs C# - R

Kiedy uruchomić następujący program testowy:

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

otrzymuję ten wyjątek:

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

Z góry dzięki.

AKTUALIZACJA: OK, wciąż nie ma szczęścia. Postaram się wyjaśnić, co zrobiłem do tej pory.

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

Z Scilab to podstawowy test. Starałem się go uruchomić, ale mam następujący błąd:

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

niż Spojrzałem w zmiennych PATH/system i nie znalazł ścieżka/R_HOME/R_USER info. Ponadto nie mogłem znaleźć w rejestrze niczego związanego z R.

Podejrzewam, że robię coś bardzo złego, więc bardzo potrzebuję pomocy od was.

+1

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

Odpowiedz

11

Ok, ja to w końcu rozwiązany. Problem polega na tym, że R (D) Com nie działa z aktualną wersją R. Zainstalowałem 2.11.1 i działało z pudełka.

Wielkie dzięki.

+0

Nie mogłem go uruchomić z R v2.11.1 x64 (być może muszę zainstalować wersję x32?). – Contango

4

Od 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

Dzięki za odpowiedź, ale wciąż nic. Wrzuciłem plik rscproxy.dll do C: \ Program Files \ R \ R-2.12.2 \ bin \ rscproxy, ale nadal otrzymuję 80040013, zmienne środowiskowe są poprawnie skonfigurowane. Jakieś inne sugestie? – Klark

+0

Klark: Czy 'rscproxy' jest zainstalowany w domyślnej lokalizacji biblioteki (' R_HOME/library/rscproxy')? Wydaje mi się, że pamiętam, że się zepsuł, jeśli użyjesz niestandardowego 'R_LIBRARY'. –

+0

tak jest. Aktualizuję moje pytanie. Proszę spojrzeć. Dzięki – Klark

15

Można spojrzeć na R.NET dla innego podejścia ...

+0

Mam R.NET pracujący pod VS2012, z R 2.11.1 x32. Zadziałało, gdy skompilowano dla "x32" i "Wszystkie CPU" (patrz "Menedżer konfiguracji"). Nie działało, gdy wskazano na R 2.11.1 x64 ("DLL nie został znaleziony"). – Contango

+0

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

8

Użyj R.NET (zainstalowałem koparkę z NuGet) i następującego kodu w nowej aplikacji konsoli C# (która została skopiowana z niewielkimi zmianami z http://rdotnet.codeplex.com/).

Będzie działać, gdy zostanie wskazany w 32-bitowej wersji R v2.11.1, ale nie zadziała, gdy zostanie wskazany na 64-bitową wersję R v2.11.1 (jak podano w poniższym kodzie).

Kiedy zainstalowałem NuGet, automatycznie dodaje on odniesienia do bieżącego projektu: RDotNet (RDotNet.dll) i RDotNet.NativeLIbrary (RDotNet.NativeLibrary.dll). Będziesz potrzebował tych odniesień w każdym nowym projekcie.

Działa pod VS2012 (nietestowane pod VS2010, ale prawdopodobnie będzie działać).

Działa, gdy jest skompilowany dla "x32" i "Wszystkie procesory" (w "Menedżer konfiguracji Build" w 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

Preferuję R.NET do podejścia R (D) COM. Czy to "nie działa" w scenariuszach x64 z powodu niedopasowania celów architektury dla zaangażowanych komponentów? Dzięki nowym wersjom R.NET (1.6) nie musisz ustawiać ścieżki w swoim kodzie C#; metoda R.NET Initialize znajduje instalację R na twoim komputerze. Jednak w przypadku aplikacji MVC, VS2013 NET 4.51 z celem dowolnego procesora, musiałem ustawić ścieżkę systemową tak, aby wskazywała 32-bitowe R C: \ Program Files \ R \ R-3.1.0 \ bin \ i386. Dołączając do ścieżki, 64-bitowy plik R C: \ Program Files \ R \ R-3.1.0 \ bin \ x64 spowodował błąd wskazujący na problemy wywołujące funkcje w R.dll. – subsci

+0

@subsci Całkowicie się zgadzam, R.NET jest znacznie lepszy niż R (D) COM, po prostu działa. – Contango

3

Problem:

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

Rozwiązanie: [Nawiasem mówiąc, mam R, R RStudio, rewolucja w moim PC]

1.Instalacja niezbędne programy i pakiety:
Do wykonywania wykładniczych wygładzanie w Eviews (7.2), wymagane są dodatki ExpSmooth.
Aby dodatki ExpSmooth działały poprawnie, należy zainstalować program R oraz pakiety forecast i rscproxy; i statconnDCOM musi być zainstalowany.

2.Umieść pliki i foldery do odpowiednich miejsc BIN i Biblioteka:
Kopiuj-wklej do pliku rscproxy.dll do C:\Program Files\R\R-2.15.3\bin i C:\Revolution\R-Enterprise-6.1\R-2.14.2\bin folderach.
Umieść folder rscproxy w pliku rscproxy_2.0-5.zip w folderach C:\Revolution\R-Enterprise-6.1\R-2.14.2\library i .

3.Dodatkowe informacje:
nie wprowadzać żadnych zmian w zmiennych środowiskowych w celu przezwyciężenia tego problemu w pytaniu.
Po raz pierwszy ustawiłem pewne zmienne środowiskowe, gdy zainstalowałem R i Revolution R w ten sposób (ustawienie to nie ma związku z kontekstem):
Zmienne systemowe - Ścieżka: C: \ Rtools \ bin; C: \ Pliki programów \ R \ R-3.0.2 \ bin \ i386; C: \ Rtools \ gcc-4.6.3 \ bin;
(Oferuję ustawienie wersji R, którą zainstalowałeś i używasz).
Uruchomienie Server 01 – Basic Test, które istniało po instalacji statconnDCOM: Start - statconn - DCOM - "Server 01 - Basic Test".
Naciśnij do R.
statconnDCOM działało.

3

Oto jak wywołać niestandardową funkcję R z pliku Rdata (nie tylko wbudowaną funkcję R). Właściwie to właśnie dla mnie zadziałało. Aby uzyskać działanie StatConnectorClass, musiałem otworzyć właściwości dla StatConnectorsRVLib i ustawić "Embed Interop Types" na 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(); 
      } 

Mam nadzieję, że to pomoże!