0

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

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

任何帮助将不胜感激。

使用 R.NET 的问题:(新编辑)

我使用过 R.NET,但第二次运行时出现 stackoverflow 错误。因此使用以下代码来清除内存:

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();

但现在我在声明中得到“System.AccessViolationException”

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

请帮助我..

4

1 回答 1

0

我无法回答有关 R(D)COM 的问题,但据我所知,R.NET 没有任何问题可以按照您的描述进行操作。请参阅 https://github.com/jmp75/rdotnet-onboarding,其中包括一个新添加的 SupportSamples 项目,转载如下以获取信息。它运行得很好,至少在 Linux 机器上。

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

希望这可以帮助。

下面的代码使用:

  • Linux 3.16.0-4-amd64
  • Mono 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];
    }
    
于 2014-12-31T06:36:29.220 回答