2013-02-09 16 views
5

C#からユーザ定義(カスタム)R関数を呼び出すことはできますか?例えばC#からユーザ定義の(カスタム)R関数を呼び出すことはできますか?

Rで書かれた簡単な行列乗算機能:

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

がどのように私はこのR関数matrix_mult(a、b)はCから呼び出すことができます#?

+0

のデータタイプを参照http://rdotnet.codeplex.com/documentation C# から呼び出します/r-release/R-exts.html#The-R-API)は、* R *を使った* C *インタフェーシングの* R *マニュアルセクションへのリンクです。 P/Invokeを使用すると、代わりにC#から対応する呼び出しを適用するのはかなり簡単です。 –

+0

RフォームC#をなぜ呼びたいのかについて、文脈と理由についての詳細を教えてください。 – agstudy

+0

@agstudy Rで書かれた行列関数を.netの関数ルーター構成で使用するためにhttp://finaquant.com/function-router/2802 – tuncalik

答えて

1

短い答え:いいえ。

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

これは、2台のマシンを使用して弱いカップリングで実行することができます。これは、Rserveと1つの.Net/C#で接続されています。例えば、RserveCLIのようにそこにいくつかの解決策があります。

8

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

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

2) http://rdotnet.codeplex.com

インストールは簡単です)R.NET(NuGetをインストールします。 メニュー:Visual Studioの(2012)>ライブラリパッケージマネージャ]> [パッケージマネージャコンソール タイプ "インストール・パッケージR.NET"

3)[ここ](http://cran.r-project.org/doc/manuals Rの関数を初期化し、R

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(); 
    } 
} 
} 
+1

行列aとbをどのようにしてR関数に渡すことができますか? –

+0

誰かがc#で何らかの入力を定義し、それをRに渡したいと思っている人は、どうやってそれを行うことができますか?私はある変数に格納されているベクトルを渡したかったのですが、同じ変数が二重引用符でR入力ベクトルに渡されていましたが、変数が見つかりませんでしたエラーが表示されました。 これを行う方法はありますか? –

+0

配列パラメータがC#からRに渡される方法を知るには、http://finaquant.com/table-data-as-input-to-estimationの私の記事「Rの推定関数への入力としてのテーブルデータ」を参照してください。 -functions-in-r/3082 C#のコード例を参照してください。 – tuncalik

関連する問題