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))
答案 0 :(得分:0)
您可以从C#
中获取R文件rConn.Evaluate("source('other_r_code.R')");
这将执行该文件中的代码,因此请确保它具有函数定义,而不是您实际想要执行的代码。您可以使用R中的setwd
和getwd
指定文件的完整路径或使用工作目录。
迄今为止我看到的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();
}