2015-06-14 66 views
0

我想在c#中顯示橢圓。我的代碼是好的,當R中運行,但我從C#像這樣得到的消息: 「對象是靜態的;不允許操作(從HRESULT異常:0x8004000B(OLE_E_STATIC))」C#:無法從R執行代碼

這裏這是我的代碼:

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([email protected], d2 = d2.95, [email protected]), col='blue', lty='7' , lwd='2') "); 
     axGraphicsDevice2.RemoveFromConnector(); 
    } 

在我評論的任何代碼中總是得到相同的錯誤。我不知道爲什麼會出現這個問題。任何想法如何顯示該橢圓?非常感謝你,因爲你幫助我完成論文。

+0

如果通過它進行調試,它會失敗的是哪一行? – SteveFerg

+0

什麼是rconn?你的操作系統是什麼?請包括相關信息。 http://stackoverflow.com/help/how-to-ask –

+0

@SteveFerg:我使用funtion橢球點時出錯 – riu

回答

0

一些缺失的上下文信息,但根據您提供的猜測,當您操作刷新圖形設備(線條,多行文字等)時,您的「rconn」(statconnector?)並不快樂。

因爲我需要從c#(與R.NET)測試一些R圖形的東西爲我自己的目的,我用你的代碼作爲基礎,並提出它作爲一個解決方法,你嘗試。你會發現一個示例應用程序,它的工作原理,使用​​,在GitHub下: https://github.com/jmp75/rdotnet-support/tree/master/samples/DrawEllipse

編譯/從VS2013,Windows7的64位來看,.NET框架4.5。

我注意到我需要選擇使用dev.hold和dev.flush來獲得直觀的刷新。

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

希望這會有所幫助。

+0

是的。我使用statconnector。順便說一句,dev.hold和dev.flush的功能是什麼? - @ j-m – riu