Displaying a Chart with WPF Dynamic Data Display.
App.xaml.cs
privatevoid Application_Startup(object sender, StartupEventArgs e) { // Assumes that PATH is set correctly. REngine.CreateInstance("RDotNet"); } privatevoid Application_Exit(object sender, ExitEventArgs e) { REngine engine = REngine.GetInstanceFromID("RDotNet"); if (engine != null) { engine.Close(); } }
MainWindow.xaml.cs
privatevoid 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));