当我通过statconnector连接C#和R时,我可以访问R中stat库的基本功能。但是如果我加载一个库(),我就无法调用它的任何功能。
我正在尝试的代码是:
rConn.SetSymbol("n1", 20);
rConn.Evaluate("library(dtw)");
rConn.Evaluate("x1<-rnorm(n1)");
rConn.Evaluate("x2<-rnorm(n1)");
rConn.Evaluate("Score<-dtw(x1,x2,keep.internals=TRUE)");
我得到的错误是当我运行最后一行时,即rConn.Evaluate("Score<-dtw(x1,x2,keep.internals=TRUE)");
我得到的错误是 -
There is no connection for this connection ID (Exception from HRESULT: 0x80040004 (OLE_E_NOCONNECTION))
答案 0 :(得分:0)
您会发现,通过StatConnector调用的某些函数必须使用.EvaluateNoReturn而不是.Evaluate。如果你认识到如果你通过以下方式检查“得分”(在R中),那么这是有道理的。
class(Score)
[1] "dtw"
您会看到“分数”包含一个dtw对象。无论何时使用.Evaluate,都会隐式调用具有返回值的函数。但是,C#不知道如何处理dtw对象,所以你得到一个时髦的错误信息,让你去嗯。尝试相当于void调用:
rConn.EvaluateNoReturn("Score<-dtw(x1,x2,keep.internals=TRUE)");
你应该没有错误执行dtw。要将返回值返回到C#,而在R中,请查看名称(分数)以查看哪些变量可用,然后是
class(Score$normalizedDistance)
"numeric"
了解如何为C#转换值,如:
double myDist = (double)rConn.Evaluate("Score$normalizedDistance");
答案 1 :(得分:0)
其他信息我发现在调用10个并发的statconnector实例时收到了类似的错误。
返回值时的.Evaluate函数在10%的计算失败时会出现以下错误
There is no connection for this connection ID (Exception from HRESULT: 0x80040004 (OLE_E_NOCONNECTION))
at StatConnectorCommonLib.IStatConnector.Evaluate(String bstrExpression)
我发现工作的修复方法是将结果存储在R中的变量中,并使用.EvaluateNoReturn和.GetSymbol返回结果。
StatConnector rConn = new StatConnector();
rConn.Init("R");
rConn.SetSymbol("n1", 20);
rConn.Evaluate ("x1<-rnorm(n1)");
var o = rConn.GetSymbol ("x1");
foreach (double d in o)
Console.WriteLine(d);
rConn.Close();
查看以下文章,了解我的来源和示例, http://www.billbak.com/2010/11/accessing-r-from-clessons-learned/