簡體   English   中英

如何從C#執行R函數?

[英]How to execute a function of R from c#?

我正在嘗試使用C#(已安裝R.NET)執行用R編寫的簡單函數,如下所示

using Microsoft.Win32;
using RDotNet;
using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {          

            using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\R-core\R"))
            {
                var envPath = Environment.GetEnvironmentVariable("PATH");
                string rBinPath = (string)registryKey.GetValue("InstallPath");
                string rVersion = (string)registryKey.GetValue("Current Version");
                rBinPath = System.Environment.Is64BitProcess ? rBinPath + "\\bin\\x64" :
                                                                 rBinPath + "\\bin\\i386";
                Environment.SetEnvironmentVariable("PATH",
                                      envPath + Path.PathSeparator + rBinPath);
            }


            using (REngine engine = REngine.CreateInstance("RDotNet"))
            {
                // Initializes settings.
                engine.Initialize();


                var myAddFunc = engine.Evaluate(@"addFunc <- function(a,b) {
                                                                 a+b 
                                                  }").AsFunction();

                var sum = engine.Evaluate("@d <- myAddFunc(10,20))").AsNumeric();

                engine.Evaluate("print(sum)");                

                Console.ReadKey();
            }
        }
    }
}

但是在錯誤

var sum = engine.Evaluate(“ @ d <-myAddFunc(10,20))”)。AsNumeric();

RDotNet.dll中發生類型為'System.ArgumentNullException'的未處理異常。其他信息:值不能為null。

在此處輸入圖片說明

我在做什么錯?

在R-Console中運行程序工作正常

> addFunc <- function(a,b) {
+    a+b 
+ }
> d<- addFunc(30,40)
> print(d)
[1] 70

錯字了嗎? @應該在字符串之外。 另外,不應用2個圓括號將其括起來。

"@d <- myAddFunc(10,20))"

應該

@"d <- myAddFunc(10,20)"

我知道我為此遲到了兩年多,您解決了嗎? 無論如何,嘗試一下

using (REngine engine = REngine.CreateInstance("RDotNet"))
                {
                    // Initializes settings.
                    engine.Initialize();


                    var myAddFunc = engine.Evaluate(@"addFunc  <- function(a,b) {
                                                        a+b
                                                      }").AsFunction();

                    var sum = engine.Evaluate(@"addFunc(12,30)").AsNumeric();

                    engine.Evaluate("print(sum)");
                    Console.Write(sum[0].ToString());
                    Console.ReadKey();
                }

您需要在第二個Evaluate語句中使用addFunc而不是myAddFunc(即

var sum = engine.Evaluate(@"addFunc(12,30)").AsNumeric();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM