Monday, 14 May 2012

Call R from Java

We can integrate R with Java or java based application using Rserve.
What is Reserve?
Rserve is a TCP/IP server which allows other programs to use facilities of R (see www.r-project.org) from various languages without the need to initialize R or link against R library. Every connection has a separate workspace and working directory. Client-side implementations are available for popular languages such as C/C++, PHP and Java. Rserve supports remote connection, authentication and file transfer. Typical use is to integrate R backend for computation of statstical models, plots etc. in other applications.

I am going to show you an example of creating a R graph from Java.

To call R from java you have to download some JAR files . Download these files from
http://www.rforge.net/Rserve/files/

1:- Start Eclipse and create a new java project







2:- Add REngine and RserveEngine.jar JAR files
3:- Add a class file and copy this code to start Rserve and just run that class file

package com.test.CallRfromJava;


import org.rosuda.REngine.*;
import org.rosuda.REngine.Rserve.*;

public class callingrserve {



     public static void main(String[] args) throws RserveException, REXPMismatchException {
            try {
                RConnection c = new RConnection();// make a new local connection on default port (6311)
                double d[] = c.eval("rnorm(10)").asDoubles();
                org.rosuda.REngine.REXP x0 = c.eval("R.version.string");
                System.out.println(x0.asString());
    } catch (REngineException e) {
                //manipulation
            }     

        }

        }


4:- Add  one more class file and copy this code and run that file, you should get the a R graph

package com.test.CallRfromJava;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;

import org.rosuda.REngine.*;
import org.rosuda.REngine.Rserve.*;

public class PlotDemo extends Canvas {
    public static void main(String args[]) {
        try {
            String device = "jpeg";
          
          
    RConnection c = new RConnection((args.length>0)?args[0]:"127.0.0.1");

    if (c.parseAndEval("suppressWarnings(require('Cairo',quietly=TRUE))").asInteger()>0)
        device="CairoJPEG";
            else
            System.out.println("(consider installing Cairo package for better bitmap output)");
          
           REXP xp = c.parseAndEval("try("+device+"('test.jpg',quality=90))");
           
         if (xp.inherits("try-error")) {
                System.err.println("Can't open "+device+" graphics device:\n"+xp.asString());
              
 REXP w = c.eval("if (exists('last.warning') && length(last.warning)>0) names(last.warning)[1] else 0");
                if (w.isString()) System.err.println(w.asString());
                return;
            }
                
    c.parseAndEval("data(iris); attach(iris); plot(Sepal.Length, Petal.Length, col=unclass(Species)); dev.off()");
           

            xp = c.parseAndEval("r=readBin('test.jpg','raw',1024*1024); unlink('test.jpg'); r");
          
            Image img = Toolkit.getDefaultToolkit().createImage(xp.asBytes());
           
            Frame f = new Frame("Test image");
            f.add(new PlotDemo(img));
            f.addWindowListener(new WindowAdapter() {
                // just so we can close the window
                public void windowClosing(WindowEvent e) { System.exit(0); }
            });
            f.pack();
            f.setVisible(true);

            // close RConnection, we're done
            c.close();
        } catch (RserveException rse) {
            // RserveException (transport layer - e.g. Rserve is not running)
            System.out.println(rse);
        } catch (REXPMismatchException mme) {
            // REXP mismatch exception (we got something we didn't think we get)
            System.out.println(mme);
            mme.printStackTrace();
        } catch(Exception e) {
            // something else
            System.out.println("Something went wrong, but it's not the Rserve: "
                               +e.getMessage());
            e.printStackTrace();
        }
    }
   
    Image img;

    public PlotDemo(Image img) {
        this.img=img;
        MediaTracker mediaTracker = new MediaTracker(this);
        mediaTracker.addImage(img, 0);
        try {
            mediaTracker.waitForID(0);
        } catch (InterruptedException ie) {
            System.err.println(ie);
            System.exit(1);
        }
        setSize(img.getWidth(null), img.getHeight(null));
    }
   
    public void paint(Graphics g) {
        g.drawImage(img, 0, 0, null);
    }
}