R with COM the dark side of .NET

advertisement
Zurich
R with COM
the dark side of .NET
john@mango-solutions.com
R with COM
the dark side of .NET
 Why I am talking about ‘nothing to do with R’
 What are the issues with integrating R with other




languages?
The .NET paradigm
Work done at codeplex
A simple example done for free
Graphing
nothing to do with R
 R solves difficult but particular problems
 Enterprises have other issues
 Integration with databases
 R may be part of much larger developments
 There is no concept of workflow
integrating R
 R is late binding
 Variable ‘types’ change at every step
 Manages its own memory
 Initial design as a pipe application, stdin, stdout (like sed etc.)
integrating R
 The big problem is exchanging complex objects in memory
 Strings are never a problem!
 Vectors, matrices, lists must be mapped to concepts inj the host
language
 COM solves by creating is own process with R
 Expensive!
 Java integration solves by utilizing only static types
 Need to know a lot about the data before
 .NET introduces “marshalling”
 An buffer area where data can be read/written between
managed and un-managed code
.NET paradigm
 (From Windows)
 Event Handling
 Common Run Time
 Now towards its 4th incarnation
 Good support for threading
 security
 Remoting
 Diverse application languages
 Adoption (and rejection) of new languages (e.g. J# and F#)
Events
 Message passing paradigm including call-backs
private void Application_Startup(object sender, StartupEventArgs e)
{
REngine.SetDllDirectory(@"C:\R\R-2.10.1\bin");
REngine.CreateInstance("RDotNet");
}
private void Application_Exit(object sender, ExitEventArgs e)
{
REngine engine = REngine.GetInstanceFromID("RDotNet");
if (engine != null)
{
engine.Close();
}
}
XAML and ‘code-behind’
rdotnet.codeplex.com
 Microsoft Project Hosting for Open Source Software
 Implementation of R.h and Rinternals.h
internal interface INativeMethodsProxy
{
int Rf_initEmbeddedR(int argc, string[] argv);
void Rf_endEmbeddedR(int fatal);
IntPtr Rf_protect(IntPtr sexp);
void Rf_unprotect(int count);
void Rf_unprotect_ptr(IntPtr sexp);
 Very impressive C# code
 Currently only console device
Classes in R.NET bridges between R
and .NET Framework.
R
R.NET
.NET Framework
character vector
RDotNet.CharacterVector
System.String[]
integer vector
RDotNet.IntegerVector
System.Int32[]
real vector
RDotNet.NumericVector
System.Double[]
complex vector
RDotNet.ComplexVector
System.Numerics.Complex[]
raw vector
RDotNet.RawVector
System.Byte[]
logical vector
RDotNet.LogicalVector
System.Boolean[]
character matrix
RDotNet.CharacterMatrix
System.String[, ]
integer matrix
RDotNet.IntegerMatrix
System.Int32[, ]
real matrix
RDotNet.NumericMatrix
System.Double[, ]
complex matrix
RDotNet.ComplexMatrix
System.Numerics.Complex[, ]
raw matrix
RDotNet.RawMatrix
System.Byte[, ]
logical matrix
RDotNet.LogicalMatrix
System.Boolean[, ]
Note
The minimum value in R is 2^31+1 while that of .NET
Framework is -2^31.
System.Numerics assembly is
required for .NET Framework 4.
The minimum value in R is 2^31+1 while that of .NET
Framework is -2^31.
System.Numerics assembly is
required for .NET Framework 4.
A simple example done for free
Graphing
Conclusions
 .NET provides a modern wrapper for making the best use of
R
 .NET can be developed for free
 A full environment does cost a little
 An open license without the R(D)COM constraints
 Just as easy to integrate with Excel
Download