4

I am new to R programming. I have created a simple R script and trying to run it using JAVA class, but I am unable to do it.

I have tried by using Rserve as well as rJava. Using Rserve, code execution stopped after creating instance of "RConnection" whereas using rJava giving exception "java.lang.UnsatisfiedLinkError: jri.dll: Can't find dependent libraries".

The JAVA class code is as below:

For rJava:

    import org.rosuda.JRI.Rengine;
public class Temp {

public static void main(String a[]) {
    // Create an R vector in the form of a string.
    String javaVector = "c(1,2,3,4,5)";

    // Start Rengine.
    Rengine engine = new Rengine(new String[] { "--no-save" }, false, null);

    // The vector that was created in JAVA context is stored in 'rVector' which is a variable in R context.
    engine.eval("rVector=" + javaVector);

    //Calculate MEAN of vector using R syntax.
    engine.eval("meanVal=mean(rVector)");

    //Retrieve MEAN value
    double mean = engine.eval("meanVal").asDouble();

    //Print output values
    System.out.println("Mean of given vector is=" + mean);

}
}

For Rserve:

import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
public class Temp {

public static void main(String a[]) {
    RConnection connection = null;
    System.out.println("line 10");
    try {
        // Create a connection to Rserve instance running on default port 6311

        System.out.println("line 15");
        connection = new RConnection();
        System.out.println("line 17");
        //Note four slashes (\\\\) in the path
        connection.eval("source('D:\\\\RExamples\\\\helloworld.R')");
        System.out.println("line 19");
        int num1=10;
        int num2=20;
        int sum=connection.eval("myAdd("+num1+","+num2+")").asInteger();
        System.out.println("The sum is=" + sum);
    } catch (RserveException e) {
        e.printStackTrace();
    } catch (REXPMismatchException e) {
        e.printStackTrace();
    }
}
}

Please let me know if my question is not clear to you or if you want to know anything else. Thanks in advance.

2
  • How did you configure your RConnection()? Sounds like you need to investigate the configuration. Maybe put a breakpoint inside the RConnection() constructor to verify the connection. Commented Sep 3, 2015 at 11:27
  • You can tell me some other way also. I got this code from Google. Commented Sep 3, 2015 at 11:34

3 Answers 3

2

There are two different approach to connect Java and R.

If you want to use JRI, you have to start your java program using the JVM parameter -Djava.library.path pointing at the folder that contains JRI library.

For instance:

$JAVA_HOME/bin/java  -Djava.library.path=/app/vendor/R/lib/R/library/rJava/jri/ -jar target/myapp.jar

If you have trouble finding JRI installation directory, try to look for the JRI SO library:

find / -name "libjri.*"

In addition, make sure you have created R_HOME and LD_LIBRARY_PATH in your environment:

  • R_HOME: Pointing to your local R installation (Ej: /Library/Frameworks/R.framework/Resources)
  • LD_LIBRARY_PATH: Pointing to R lib directory as well as JRI directory (EJ: $LD_LIBRARY_PATH:/app/vendor/R/lib/R/lib:/app/vendor/R/lib/R/bin)

On the other hand, if you want to use Rserve, you need to start Rserve in a separate process, and then create a RConnection from your java process.

For example:

        if(LOGGER.isInfoEnabled()) {
            LOGGER.info("Starting RServe process...");
        }
        ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", String.format("echo 'library(Rserve);Rserve(FALSE,args=\"--no-save --slave --RS-conf %s\")'|%s --no-save --slave", rserveConf, rexe));
        builder.inheritIO();
        Process rProcess = builder.start();

        if(LOGGER.isInfoEnabled()) {
            LOGGER.info("Waiting for Rserve to start...");
        }
        int execCodeResult = rProcess.waitFor();

        if(execCodeResult != SUCCESS_CODE) {
            LOGGER.error(String.format("Unexpected error code starting RServe: %d", execCodeResult));
        } else {
            LOGGER.error("RServe started successfully");
        }

        if(LOGGER.isInfoEnabled()) {
            LOGGER.info("Opening connection to RServe daemon....");
        }
        REngine engine = new RConnection();
        if(LOGGER.isInfoEnabled()) {
            LOGGER.info(String.format("Obtaining R server version: %d", ((RConnection)engine).getServerVersion()));
        }
        //Perform some engine.parseAndEval("....");

rserveConf is the path to Rserv conf file and rexe is the full path to R executable.

For instance, in my MacOS computer I can start Rserve executing this line:

/bin/sh -c "echo 'library(Rserve);Rserve(FALSE,args=\"--slave --RS-conf /Users/me/Documents/test/rserve.conf\")'|/Library/Frameworks/R.framework/Versions/3.2/Resources/bin/exec/R --no-save --slave"

This command outputs something like this:

Starting Rserve:
  /Library/Frameworks/R.framework/Resources/bin/R CMD /Library/Frameworks/R.framework/Versions/3.2/Resources/library/Rserve/libs//Rserve --slave 

Rserv started in daemon mode.

Make sure to specify "--slave" parameter when you start Rserve.

If you want to see more examples, I have a demo project that use both approaches, JRI and RServe, in my github:

https://github.com/jfcorugedo/RJavaServer

Sign up to request clarification or add additional context in comments.

2 Comments

Thank a lot for reply. I am able to run my program but now I am having some other issue. Please view stackoverflow.com/questions/32581591/…
I've answered that question too
1

You just want to call an external application: wouldn't the following work?

Runtime.getRuntime().exec("Rscript myScript.R"); 

Credit goes to stackoverflow itself

2 Comments

Can you please tell me how can I use this. As by using this in java class it is showing nothing.
You can run your script so that it will write the output to a csv file. Later you can read that file for output of the script. Read the given link for more details.
0

An alternative is to use r's OpenCpu package. This is a very simple server (single threaded unfortunately) that receives r function calls over http and returns the output as the response.

I have used it to interface with java.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.