2013-02-09 15 views
5

Czy można wywołać zdefiniowaną przez użytkownika (niestandardową) funkcję R z poziomu C#?Czy można wywołać zdefiniowaną przez użytkownika (niestandardową) funkcję R z poziomu C#?

Na przykład, proste mnożenie macierzy funkcji napisany w R:

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

Jak można nazwać to funkcja matrix_mult R (A, B), C#?

+0

[tutaj] (http://cran.r-project.org/doc/manuals /r-release/R-exts.html#The-R-API) jest łączem do sekcji * R * podręcznika na * C * intefacing z * R *. Używając P/Invoke, powinno być dość łatwo zastosować odpowiednie wywołania z C#. –

+0

Czy możesz podać nam więcej informacji na temat kontekstu i powodów, dla których chcesz wywołać formularz R C#? – agstudy

+0

@agstudy w celu użycia funkcji macierzy zapisanej w R z konstrukcją funkcji routera w .net http://finaquant.com/function-router/2802 – tuncalik

Odpowiedz

1

Krótka odpowiedź: nr

Nieco dłuższa odpowiedź: Niewłaściwy łańcuch narzędzi. R w systemie Windows jest zbudowany z portu MinGW gcc. Łączenie jest gdzieś pomiędzy niemożliwym a bardzo delikatnym.

Można to zrobić tylko przy słabym sprzężeniu za pomocą dwóch maszyn, mających Rserve na jednym urządzeniu i połączenie .Net/C# z nim. Istnieje kilka rozwiązań takich jak np. RserveCLI.

8

Po pewnych badaniach sam znalazłem odpowiedź.

1) Otwórz istniejący lub nowy projekt w MS Visual Studio.

2) Zainstaluj R.NET (Nuget) http://rdotnet.codeplex.com

Instalacja jest prosta: Menu: Visual Studio (2012)> Biblioteka Package Manager> Pakiet konsoli Menedżer typu "Install-Package R.NET"

3) Inicjalizuj funkcję w R i nazwać C# Patrz http://rdotnet.codeplex.com/documentation dla typów danych w 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

W jaki sposób macierze a i b mogą być przekazywane do funkcji R? –

+0

Jeśli ktoś chce zdefiniować niektóre dane wejściowe w języku C#, a następnie przekazać je do R, jak to zrobić? Chciałem przekazać wektor, który jest przechowywany w pewnej zmiennej, tej samej zmiennej, którą przekazywałem do wektora wejściowego R w podwójnych cudzysłowach, ale pojawił się błąd o nieznanej zmiennej. Czy jest jakiś sposób to zrobić? –

+0

Aby zobaczyć, jak parametry tablicy są przekazywane z C# do R, możesz odwiedzić mój artykuł "Dane tabelowe jako dane wejściowe dla funkcji estymacji w R" pod adresem http://finaquant.com/table-data-as-input-to-estimation -functions-in-r/3082 zobacz przykłady kodu C# pod podtytułem "Integracja R z funkcjami tabel w C#" – tuncalik

Powiązane problemy