0

当我通过statconnector连接C#和R时,我可以访问R中stat库的基本功能。但是如果我加载一个 library(),我就不能调用它的任何函数。

我正在尝试的代码是:

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))
4

2 回答 2

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/

于 2013-09-30T15:39:21.707 回答
0

您会发现,对于通过 StatConnector 调用的某些函数,您必须使用 .EvaluateNoReturn 而不是 .Evaluate。如果您认识到,如果您通过以下方式检查“Score”类(在 R 内),那么这是有道理的:

class(Score)
[1] "dtw"

您会看到“Score”包含一个 dtw 对象。每当您使用 .Evaluate 时,都会隐含地调用具有返回值的函数。但是,C# 不知道如何处理 dtw 对象,因此您会收到一条时髦的错误消息,让您觉得很糟糕。尝试等效于 void 调用:

rConn.EvaluateNoReturn("Score<-dtw(x1,x2,keep.internals=TRUE)");

执行 dtw 应该没有错误。要将返回值返回到 C#,而在 R 中,请查看 names(Score) 以查看哪些变量可用,然后类似于

class(Score$normalizedDistance)
"numeric"

了解如何为 C# 转换值,如下所示:

double myDist = (double)rConn.Evaluate("Score$normalizedDistance");
于 2013-04-16T04:45:59.673 回答