C# - R interface

后端 未结 6 467
慢半拍i
慢半拍i 2020-11-30 04:20

I need to interface R to some C# application. I installed rscproxy_1.3 and R_Scilab_DCOM3.0-1B5 added COM references to the STATCONNECTORCLNT

相关标签:
6条回答
  • 2020-11-30 04:35

    Here is how to call a custom R Function from an Rdata file ( not just a built-in R function). Actually this is what worked for me. To get StatConnectorClass working, I had to open up the properties for StatConnectorsRVLib and set 'Embed Interop Types' to 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!

    0 讨论(0)
  • 2020-11-30 04:39

    Use R.NET (I installed mine from NuGet) and the following code in a new C# console app (which was copied with minor changes from http://rdotnet.codeplex.com/).

    It will work when pointed at the 32-bit version of R v2.11.1, but it will not work when pointed at the 64-bit version of R v2.11.1 (as noted in the code below).

    When I installed NuGet, it automatically added references to the current project: RDotNet (RDotNet.dll) and RDotNet.NativeLIbrary (RDotNet.NativeLibrary.dll). You'll need these references in any new project.

    Works under VS2012 (untested under VS2010, but will probably work).

    Works when compiled for both "x32" and "All CPU" (under "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 讨论(0)
  • 2020-11-30 04:47

    Ok, I solved it finally. The problem is that R (D)Com doesn't work with current version of R. I installed 2.11.1 and it worked out of box.

    Thanks a lot.

    0 讨论(0)
  • 2020-11-30 04:50

    You can have a look at R.NET, for another approach...

    0 讨论(0)
  • 2020-11-30 04:56

    From 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 讨论(0)
  • 2020-11-30 05:00

    Problem:

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

    Solution: [By the way, I have R, RStudio, Revolution R in my PC]

    1. Install the necessary programs and packages:
    For performing exponential smoothing in Eviews (7.2), ExpSmooth add-ins is necessary.
    For the ExpSmooth add-ins to properly work, the program R, and the packages forecast and rscproxy must be installed; and statconnDCOM must be installed.

    2. Put the files and folders to the correct BIN and LIBRARY locations:
    Copy-paste the file rscproxy.dll to the C:\Program Files\R\R-2.15.3\bin and C:\Revolution\R-Enterprise-6.1\R-2.14.2\bin folders.
    Put the rscproxy folder in rscproxy_2.0-5.zip file to the C:\Revolution\R-Enterprise-6.1\R-2.14.2\library and C:\Program Files\R\R-2.15.3\library folders.

    3. Additional info:
    I did not make any changes to environment variables to overcome the problem in question.
    I had set some environment variables for the first time when I installed R and Revolution R like that (this setting is irrelavant with the context here):
    System variables - Path: C:\Rtools\bin;C:\Program Files\R\R-3.0.2\bin\i386;C:\Rtools\gcc-4.6.3\bin;
    (I offer you to set the R version that you installed and use).
    Run Server 01 – Basic Test that existed upon installing statconnDCOM: Start - statconn – DCOM - “Server 01 – Basic Test”.
    Press to R.
    statconnDCOM worked.

    0 讨论(0)
提交回复
热议问题