R (D)COM 如何将 C# 数组导入 R 以对其应用一些 R 算法

本文关键字:应用 算法 导入 COM 数组 | 更新日期: 2023-09-27 18:35:43

我已经阅读了有关将数据从文本文件导入R并使用R (D)COM处理该数据并将其保存到C#变量中的信息。但我想做的是 - 将 c# 数组/列表导入 r 变量并在此数组上执行处理。

我已经使用了所有这些 R.NET,但是未解决的错误,如engine.dispose()问题和访问冲突问题,我在代码运行时两次时得到,迫使我搜索另一个接口,我最终得到了R(D)COM。

任何帮助将不胜感激。

使用 R.NET:时出现问题(新编辑)

我用过 R.NET 但第二次运行时出现堆栈溢出错误。所以使用以下一段代码来清除内存:

engine.Evaluate("rm(gp)");
                        engine.Evaluate("rm(len)");
                        engine.Evaluate("rm(full1)");
                        engine.Evaluate("rm(full)");
                        engine.Evaluate("rm(date)");
                        engine.Evaluate("rm(value)");
                        engine.Evaluate("rm(values)");
                        engine.Evaluate("rm(partial)");
                        engine.Evaluate("rm(modval)");
                        engine.Evaluate("rm(myts)");
                        engine.Evaluate("rm(fit)");
                        engine.Evaluate("rm(h)");
                        engine.Evaluate("rm(test)");
                        engine.Evaluate("rm(testframe)");
                        engine.Evaluate("rm(meanv)");
                        engine.Evaluate("rm(lowv)");
                        engine.Evaluate("rm(highv)");
                        engine.Evaluate("rm(start1)");
                        engine.Evaluate("rm(mod)");
                        engine.Evaluate("gc()");
                        engine.Evaluate("rm( list = ls( all = TRUE ) )");
                        engine.Evaluate("gc()");  
                        GC.Collect();
                        engine.ForceGarbageCollection();

但现在我在语句中得到"系统.访问违规异常"

engine.Evaluate("fit<-ets(myts,model=mod,damped=NULL)")

请帮助我..

R (D)COM 如何将 C# 数组导入 R 以对其应用一些 R 算法

我无法回答关于 R(D)COM,但据我所知,R.NET 做你所描述的事情没有任何问题。有关信息,请参阅 https://github.com/jmp75/rdotnet-onboarding,包括新添加的 SupportSamples 项目,该项目在下面复制。它运行得很好,至少在Linux机器上是这样。

我怀疑你打电话给引擎。Dispose() 几次。在你真正完成所有计算之前不要调用它。R 限制,而不是 R.NET 错误。如果仍有问题,请使用可重现的代码将其记录下来。

希望这有帮助。

下面的代码 工作使用:

  • Linux 3.16.0-4-amd64
  • 单声道 JIT 编译器版本 3.12.1
  • R 版本 3.1.2
  • 单体开发 5.5
  • R.NET 1.5.19

    static void stackoverflow_27689786_2752565 ()
    {
        REngine.SetEnvironmentVariables();
        REngine engine = REngine.GetInstance();
        var rand = new System.Random (0);
        double[] randValues;
        for (int i = 0; i < 10; i++) {
            randValues = mkValues (rand, 100);
            Console.WriteLine ("std dev iteration {0} = {1}", i + 1, calcSDev (engine, randValues));
        }
        // you should always dispose of the REngine properly.
        // After disposing of the engine, you cannot reinitialize nor reuse it
        engine.Dispose();
    }
    static double[] mkValues (Random rand, int n)
    {
        double[] res = new double[n];
        for (int i = 0; i < n; i++) {
            var v = rand.NextDouble ();
            res [i] = (v < 0 ? -1 : 1) * v * v;
        }
        return res;
    }
    static double calcSDev (REngine engine, double[] arr)
    {
        // Note: only one quick and slightly dirty way to do it
        NumericVector rVector = engine.CreateNumericVector(arr);
        engine.SetSymbol ("x", rVector);
        return engine.Evaluate ("sd(x)").AsNumeric () [0];
    }