App.xaml.cs
private void Application_Startup(object sender, StartupEventArgs e)
{
// Assumes that PATH is set correctly.
REngine.CreateInstance("RDotNet");
}
private void Application_Exit(object sender, ExitEventArgs e)
{
REngine engine = REngine.GetInstanceFromID("RDotNet");
if (engine != null)
{
engine.Close();
}
}
MainWindow.xaml.cs
private void Window_Loaded(object sender, RoutedEventArgs e)
{
ObservableDataSource<Point> source = new ObservableDataSource<Point>();
this.plotter.AddLineGraph(source, Colors.Black, 1.0, "RVector");
REngine engine = REngine.GetInstanceFromID("RDotNet");
NumericVector sequence = engine.Evaluate("x <- seq(-3, 3, 0.01)").AsNumeric();
NumericVector dnorm = engine.Evaluate("dnorm(x, 0, 1)").AsNumeric();
IEnumerable<Point> data = sequence.Zip(dnorm, (x, y) => new Point(x, y));
source.AppendMany(data);
}
Seamlessness
R style
engine.Evaluate(@"x <- (0:12) * pi / 12
y <- cos(x)
print(y)");
Hybrid style
var x = engine.Evaluate("(0:12) * pi / 12").AsNumeric();
engine.SetSymbol("x", x);
var y = engine.Evaluate("cos(x)").AsNumeric();
Console.WriteLine(string.Join(" ", y));
C# style
var x = engine.CreateNumericVector(Enumerable.Range(0, 13).Select(i => i * Math.PI / 12).ToArray());
var cos = engine.GetSymbol("cos").AsFunction();
var y = cos.Invoke(new[] { x }).AsNumeric();
Console.WriteLine(string.Join(" ", y));