lunes, 15 de marzo de 2010

Llamar a R desde VB.NET

Hoy vamos a ver como usar la potencia del paquete matemático R desde una aplicación .NET.
Lo primero es explicar qué es R. Se trata de un lenguaje y entorno de programación de análisis estadístico (series temporales, econometría, cálculo numérico, etc..) . Además, se trata de un proyecto libre, lo que lo hace aún más goloso.
Para usar R desde código de una aplicación .NET lo primero que tenemos que hacer es instalar R y un conector, para que se pueda comunicar con la aplicación externa. Lo podemos descargar desde aqui. Así, necesitaremos descargar e instalar:

Pasamos ahora a implementar un pequeño programa que genere un vector R aleatorio y lo represente usando la librería ZedGraph. Antes necesitaremos refenciar las siguientes tres DLLs que podemos obtener a través de estos enlaces:

Finalmente, este es el código que hace lo que antes hemos comentado:




Imports STATCONNECTORCLNTLib
Imports StatConnectorCommonLib
Imports STATCONNECTORSRVLib
Imports ZedGraph

Public Class Form1

Dim sc1 As StatConnector = New STATCONNECTORSRVLib.StatConnectorClass()

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
sc1.Init("R")
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o1 As Object
Dim n As Integer = 20

sc1.SetSymbol("n1", n)
sc1.Evaluate("x1<-rnorm(n1)")
o1 = sc1.GetSymbol("x1")

Dim serie_x, serie_y As Hashtable
Dim index As Integer
serie_x = New Hashtable
serie_y = New Hashtable
For index = 0 To UBound(o1)
serie_x(index) = index
serie_y(index) = CDbl(o1(index))
Next

crearGrafica(GRAFICA, "TEST R", "X", "Y")
addCurva(GRAFICA, "Serie", Color.Blue, 2, SymbolType.None, serie_x, serie_y)

End Sub



'Dibuja una grafica usando un control ZedGraph
Sub crearGrafica(ByVal nombreControl As ZedGraph.ZedGraphControl, _
ByVal titulo As String, _
ByVal nombre_eje_x As String, _
ByVal nombre_eje_y As String)
Dim area As RectangleF
area = nombreControl.GraphPane.Rect
nombreControl.GraphPane = New GraphPane(area, titulo, nombre_eje_x, nombre_eje_y)
nombreControl.AxisChange()
nombreControl.Refresh()
End Sub


'Añade una curva
Sub addCurva(ByVal nombreControl As ZedGraph.ZedGraphControl, _
ByVal nombre As String, _
ByVal color As Color, _
ByVal anchura As Integer, _
ByVal simbolo As SymbolType, _
ByVal serie_x As Hashtable, _
ByVal serie_y As Hashtable)

Dim i As Integer
Dim puntos = New PointPairList()
Dim puntos_tendencia = New PointPairList()

For i = 0 To serie_x.Count - 1
puntos.add(serie_x(i), serie_y(i))
Next

Dim curva As LineItem = nombreControl.GraphPane.AddCurve(nombre, puntos, color, simbolo)
curva.Line.Width = anchura
curva.Line.Style = Drawing2D.DashStyle.Solid
nombreControl.AxisChange()
nombreControl.Refresh()

End Sub


End Class

No hay comentarios:

Publicar un comentario