从C#程序调用自定义R例程(在.R文件中)的步骤是什么?

时间:2014-01-16 13:19:11

标签: c# r

using StatConnectorCommonLib;
using STATCONNECTORSRVLib;

StatConnector rConn = new StatConnector();
    rConn.Init("R");
    rConn.SetSymbol("n1", 5);
    rConn.Evaluate("x1<-rnorm(n1)");
    var o = rConn.GetSymbol("x1");
    foreach (double d in o)
                    {
                        Response.Write(d + "<br />");
                    }
                    rConn.Close();

上面的代码工作正常,因为rnorm是一个内置的R函数。

我需要调用其他.R文件中编写的其他自定义(用户定义)函数。例如samplefn(n)

尽可能搜索,我在Google上找不到它....

根据#hans-roggeman的建议,我尝试了以下一行

rConn.Evaluate("source('C:\\Program Files (x86)\\R\\RFunctions\\samplefnRfile.R')");

以及这一个。

rConn.Evaluate("source(\"C:\\Program Files (x86)\\R\\RFunctions\\samplefnRfile.R\")");

他们都给出了同样的错误。来自HRESULT的异常:0x80010105(RPC_E_SERVERFAULT))

2 个答案:

答案 0 :(得分:0)

您可以从C#

中获取R文件
rConn.Evaluate("source('other_r_code.R')");

这将执行该文件中的代码,因此请确保它具有函数定义,而不是您实际想要执行的代码。您可以使用R中的setwdgetwd指定文件的完整路径或使用工作目录。

迄今为止我看到的R和OO语言的最佳集成是Dirk Eddelbuettel的Rcpp和RInside与C ++。

答案 1 :(得分:0)

好的,我现在有了答案。  我不得不使用StatConnectorClass。

要使用此类,我必须打开StatConnectorsRVLib的属性并将Embed Interop Types设置为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();
            }