2014-10-07 1 views
0

У меня есть код C# для простой формы окна с 3 кнопками. Кнопка 1 вызывает R и отображает поверхность, а кнопка 2 - контур. Если я запустил приложение и нажал кнопку 1, я правильно посмотрел на графику, но тогда я бы хотел нажать кнопку 2, чтобы открыть новое окно с контуром счетчика. К сожалению, если я попытаюсь сделать это, приложение замерзает, и я не могу продолжать. Поэтому я добавил кнопку 3 с намерением закрыть движок R, если он запущен. Идея состояла в том, чтобы убить экземпляр R и снова открыть его при нажатии на кнопку 2. Но это тоже не сработает. Есть ли способ исправить мою проблему?Графы с несколькими окнами R в C# с RDotNet

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using RDotNet; 

namespace mySurface 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void button1_Click(object sender, EventArgs e) 
    { 
     string dllPath = @"C:\Program Files\R\R-3.1.0\bin\i386\"; 
     REngine.SetDllDirectory(dllPath); 
     REngine.CreateInstance("RDotNet"); 
     REngine engine = REngine.GetInstanceFromID("RDotNet"); 

     if (engine.IsRunning == false) 
     { 
      engine.Initialize(); 
     } 

     var x = engine.Evaluate("x <- 1:100").AsNumeric(); 
     var y = engine.Evaluate("y <- 5:105").AsNumeric(); 
     engine.Evaluate("model = function (a, b){23.86+5.525*b-2.5725*a-6.6413*b^2-5.1862*a^2}"); //evaluate function 
     engine.Evaluate("z = outer(x, y ,model)"); 
     engine.Evaluate("persp(x,y,z)"); 
     //Console.WriteLine(x[0]); 
    } 

    public void button2_Click(object sender, EventArgs e) 
    { 
     string dllPath = @"C:\Program Files\R\R-3.1.0\bin\i386\"; 
     REngine.SetDllDirectory(dllPath); 
     REngine.CreateInstance("RDotNet"); 
     REngine engine = REngine.GetInstanceFromID("RDotNet"); 

     if (engine.IsRunning == false) 
     { 
      engine.Initialize(); 
     } 

     var x = engine.Evaluate("x <- 1:100").AsNumeric(); 
     var y = engine.Evaluate("y <- 5:105").AsNumeric(); 
     engine.Evaluate("model = function (a, b){23.86+5.525*b-2.5725*a-6.6413*b^2-5.1862*a^2}"); //evaluate function 
     engine.Evaluate("z = outer(x, y ,model)"); 
     engine.Evaluate("contour(x,y,z, nlevels = 10)"); 

     //Console.WriteLine(x[0]); 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     REngine engine = REngine.GetInstanceFromID("RDotNet"); 
     if (engine.IsRunning == false) 
     { 
      engine.Close(); 
     } 
    } 
} 

}

ответ

1

Вы, кажется, используя R.NET 1.5.5 или меньше. Последняя версия 1.5.16, и процедура инициализации существенно отличается. answer to a recent post on stackoverflow содержит более подробную информацию. Проблемы с попытками множественных инициализаций R типично используются для вывода симптомов, которые вы описываете, и новый API пытается предотвратить это.