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]; }