我有一个带有 3 个按钮的简单 Windows 窗体的 C# 代码。按钮 1 调用 R 并绘制曲面,而按钮 2 绘制轮廓。如果我启动应用程序并单击按钮 1,我正确地看到了曲面图,但是我想单击按钮 2 以打开一个带有计数器图的新窗口。不幸的是,如果我尝试这样做,应用程序会冻结,我无法继续。所以我添加了按钮 3,目的是在 R 引擎运行时关闭它。这个想法是在单击按钮 2 时杀死 R 实例并重新打开它。但这也不起作用。有没有办法解决我的问题?
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();
}
}
}
}