Temat: GUI do R
Czemu nieprzyjemna?
Co do przechwytywania wykresów, to z biblioteką RDCOM dostarczane są przykłady (np. w MFC, VBA), gdzie co najmniej jeden (nie pamiętam dokładnie) przechwytuje wykres z R.
C:\Program Files\R\(D)COM Server\samples\Graphics (VBA)
C:\Program Files\R\(D)COM Server\samples\MFCClient (MFC)
void CMFCClientDlg::OnTest()
{
IStatConnector lConnector;
IDispatch* lCharDev = NULL;
IDispatch* lGfxDev = NULL;
if(FAILED(m_CharDev.GetControlUnknown()->QueryInterface(IID_IDispatch,(LPVOID*) &lCharDev))) {
MessageBox("Error querying Dispatch from Character Device");
return;
}
if(FAILED(lConnector.CreateDispatch(_T("StatConnectorSrv.StatConnector")))) {
MessageBox("Error creating StatConnectorSrv");
return;
}
lConnector.Init(_T("R"));
lConnector.SetCharacterOutputDevice(lCharDev);
lConnector.AddGraphicsDevice(_T("Gfx"),m_GraphDev.GetGFX());
lConnector.EvaluateNoReturn(_T("cat(\"I am here\")"));
lConnector.EvaluateNoReturn(_T("plot(1:1000)"));
lConnector.Close();
}
Kontekst urządzenia graficznego (m_GraphDev) to kontrolka urządzenia graficznego, którą osadza się na formie, a R do niej przesyła polecenia rysowania (GDI).
Ogólna zasada (najprościej w VB):
http://rcom.univie.ac.at/download/Tutorial/EmbeddingR_...
strona 43
--------------
Tak bardzo "na szybko".
Visual C# Express 2008
Nowy projekt "Windows Forms Application".
Dodaj do toolboxa obiekt (COM) RStatConnetionGraphicsDevice.
Dodaj referencję (COM) STATCONNECTORSRVLib
Ustaw BackColor na White (ten w sekcji "Appearance", nie ten w "Misc");
A potem w kodzie:
STATCONNECTORSRVLib.StatConnectorClass r;
r = new STATCONNECTORSRVLib.StatConnectorClass();
r.Init("R");
r.AddGraphicsDevice("gfx", this.axStatConnectorGraphicsDevice1.GetGFX());
r.EvaluateNoReturn("plot(1:100,col=\"red\")");
this.axStatConnectorGraphicsDevice1.Invalidate();
r.RemoveGraphicsDevice("gfx");
Niestety, nie wiem, jak rozwiązać kwestę antyaliasingu i skalowania (to co jest, wygląda potwornie).
-------------------------
EDIT
Jeśli nie musisz mieć skalowalnego wyniku, a po prostu - statyczny obrazek z wykresem, to możesz od biedy użyć czegoś takiego:
r = new STATCONNECTORSRVLib.StatConnectorClass();
r.Init("R");
r.EvaluateNoReturn("library(Cairo)");
r.EvaluateNoReturn(@"CairoPNG('c:\\tmp\\R.png')");
r.EvaluateNoReturn("plot(1:100,col=\"red\")");
r.EvaluateNoReturn("dev.off()");
this.pictureBox1.Image = new Bitmap("c:\\tmp\\R.png");
this.pictureBox1.Invalidate();
Gdzie:
CairoPNG - funkcja z biblioteki Cairo, zapisująca wykres do PNG. Bibliotekę trzeba doinstalować:
install.packages(c("Cairo"), repos="http://cran.r-project.org" )
library(Cairo)
Zamiast
CairoPNG(...) możesz użyć zwykłego
png(...)
pictureBox1 to po prostu kontrolka PictureBox o odpowiednio dobranym rozmiarze, względnie z ustawionym skalowaniem.
Wynik jest o wiele lepszy (niewielkie "rozmycie" z uwagi na kompresję PNG):
Możesz się teraz pobawić w skalowanie obrazka przez:
1. obsługę zdarzenia "Resize" formatki,
2. podawanie do R komend, które przeskalują wykres i ponowne jego narysowanie.
ale nie wiem, czy jest to warte zachodu.
Adrian Olszewski edytował(a) ten post dnia 12.03.09 o godzinie 15:52