0

我有一个带有 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();
        }
    }
}

}

4

1 回答 1

1

您似乎使用的是 R.NET 1.5.5 或更低版本。最新版本是 1.5.16,初始化过程有很大不同。最近关于 stackoverflow 的帖子的答案提供了更多详细信息。尝试多次初始化 R 的问题通常会导致您描述的症状,而新的 API 试图阻止这种情况。

于 2014-10-10T22:56:49.830 回答