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,但据我所知,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]; }