R (D)COM, как импортировать массивы C# в R, чтобы применить к нему некоторые алгоритмы R

Я читал об импорте данных из текстового файла в R и обработке этих данных и сохранении их в переменную aC# с помощью R (D)COM. Но то, что я хочу сделать, - это импортировать aC# array/list в переменную ar и выполнить обработку этого массива.

Я использовал 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();

но теперь я получаю 'System.AccessViolationException' в заявлении

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

Пожалуйста, помогите мне..

1 ответ

Решение

Я не могу ответить по поводу R(D)COM, но у R.NET нет никаких проблем с тем, чтобы делать то, что вы описываете, насколько я вижу. См. https://github.com/jmp75/rdotnet-onboarding включая недавно добавленный проект SupportSamples, приведенный ниже для получения информации. Он работал просто отлично, по крайней мере, на Linux.

Я подозреваю, что вы вызываете engine.Dispose() несколько раз. Не называйте это, пока вы действительно не закончите со всеми вычислениями. Ограничение R, а не ошибка R.NET. Если у вас все еще есть проблема, зарегистрируйте ее как таковую с воспроизводимым кодом.

Надеюсь это поможет.

Код ниже Работал с использованием:

  • Linux 3.16.0-4-amd64
  • Моно JIT компилятор версия 3.12.1
  • Версия R 3.1.2
  • MonoDevelop 5.5
  • R.NET 1.5.19

    static void stackru_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];
    }
    
Другие вопросы по тегам