5

C#内からユーザー定義(カスタム)R関数を呼び出すことは可能ですか?

たとえば、Rで記述された単純な行列乗算関数:

matrix_mult = function(a, b) {
c = a %*% b;
return c;
}

このR関数matrix_mult(a、b)をc#から呼び出すにはどうすればよいですか?

4

2 に答える 2

8

いくつかの調査の後、私は自分で答えを見つけました。

1) MS Visual Studio で既存または新規のプロジェクトを開きます。

2) R.NET (NuGet) http://rdotnet.codeplex.comをインストールします。

インストールは簡単です: メニュー: Visual Studio (2012) > ライブラリ パッケージ マネージャー > パッケージ マネージャー コンソール タイプ "Install-Package R.NET"

3) R で関数を初期化し、C# から呼び出します。R のデータ型については、 http://rdotnet.codeplex.com/documentationを参照してください。

using RDotNet;

class Program
{
    static void Main(string[] args)
{
    // Set the folder in which R.dll locates.
    var envPath = Environment.GetEnvironmentVariable("PATH");

    // check the version and path on your computer
    var rBinPath = @"C:\Program Files\R\R-2.14.1\bin\x64";

    Environment.SetEnvironmentVariable("PATH", envPath + System.IO.Path.PathSeparator + rBinPath);

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

        // create an R function
        // R style
        // See: http://rdotnet.codeplex.com/wikipage?title=Examples&referringTitle=Home

        Function matrix_mult = engine.Evaluate(@"matrix_mult <- function(a,b){ 
        c = a %*% b;
        return(c);
        }").AsFunction();

        NumericMatrix d = engine.Evaluate(@"d <- matrix_mult(a,b)").AsNumericMatrix();

        Console.WriteLine("Matrix d:");
        engine.Evaluate("print(d)");

        // convert NumericMatrix of R to double[,] of .net
        double[,] darr = new double[d.RowCount, d.ColumnCount];
        d.CopyTo(darr, d.RowCount, d.ColumnCount);

        Console.ReadKey();
    }
}
}
于 2013-02-09T21:24:59.127 に答える
1

簡単な答え: いいえ。

少し長い答え: 間違ったツール チェーン。Windows 上の R は、MinGW gcc ポートで構築されています。リンクは、不可能から非常に壊れやすいものまでのどこかにあります。

これを行うには、2 台のマシンを使用し、1 台にRserveを使用し、それに.Net / C# 接続を使用する弱い結合を使用する必要があります。RserveCLIなど、いくつかの解決策があります。

于 2013-02-09T20:20:02.800 に答える