C#:不能从R执行代码

时间:2015-06-14 00:29:01

标签: c# r outliers drawellipse

我想在c#中显示椭圆。我的代码在R中运行时很好,但我从c#收到消息,如下所示:  "对象是静态的;不允许操作(HRESULT异常:0x8004000B(OLE_E_STATIC))"

这是我的代码:

df.rconn.Evaluate("library(cluster)")
df.rconn.Evaluate("library(rrcov)")
public void setScatter(int xAxis, int yAxis, int zAxis, List<string> variable) 
    {

        // plot from R
        //to show outlier with method : classic & robust Mve 
        this.comboBoxXAxis.SelectedIndex = xAxis;
        this.comboBoxYAxis.SelectedIndex = yAxis;
        dataform.rconn.EvaluateNoReturn("x<-X[," + xAxis + "] ");
        dataform.rconn.EvaluateNoReturn("y<-X[," + yAxis + "] ");
        dataform.rconn.EvaluateNoReturn("shape <- cov(X)");
        dataform.rconn.EvaluateNoReturn("center<- colMeans(X)");
        dataform.rconn.EvaluateNoReturn("d2.95 <- qchisq(0.95, df = 2)");
        //dataform.rconn.EvaluateNoReturn("gr<- grid(lty=3,col='lightgray', equilogs = 'TRUE')");
        //dataform.rconn.Evaluate("mtext('with classical (red) and robust (blue)')");
        dataform.rconn.EvaluateNoReturn("plot(x,y, main='Draw Ellipse ', pch=19,col='black', type='p')");
        dataform.rconn.EvaluateNoReturn("elp<- unname(ellipsoidPoints(shape, d2.95,center))");
        dataform.rconn.Evaluate(" lines(elp, col='red' , lty=7 , lwd=2)");
        //dataform.rconn.EvaluateNoReturn("lines(e)");
        //dataform.rconn.EvaluateNoReturn("lines(ellipsoidPoints(mve@cov, d2 = d2.95, loc=mve@center), col='blue', lty='7' , lwd='2') ");
        axGraphicsDevice2.RemoveFromConnector();
    }

在我评论的任何代码中总是得到相同的错误。我不知道为什么会出现这个问题。知道如何显示椭圆吗?非常感谢你,因为你帮助我完成了论文。

1 个答案:

答案 0 :(得分:0)

一些缺少的上下文信息,但按照你提供的猜测,你的&#34; rconn&#34; (statconnector?)在操作刷新图形设备(行,mtext等)时不满意。

由于我需要从c#(使用R.NET)测试一些R图形内容以用于我自己的目的,我使用您的代码作为基础并提出它作为一种解决方法供您尝试。您将在GitHub上找到一个使用R.NET的示例控制台应用程序: https://github.com/jmp75/rdotnet-support/tree/master/samples/DrawEllipse

从VS2013,Windows7 64位,.NET framework 4.5编译/运行。

我注意到我需要选择使用dev.hold和dev.flush来获得直观的刷新。

e.Evaluate("dev.hold()");
e.Evaluate("mtext('with classical (red) and robust (blue)')");
e.Evaluate("dev.flush()");

希望这有帮助。