Running Java code in R
Let’s say you have a Java class StringTest
package somepackage; public class StringTest { public String changeString(String str) { return "I have changed the string: " + str; } }
inside file
src `-- somepackage `-- StringTest.java
and you want to run it in R. All you have to do is to compile the code.
> javac -d target src/somepackage/StringTest.java
You will get compiled version of your class – it will have class extension.
target `-- somepackage `-- StringTest.class
This is the class you want to run. Let’s take a look at R.
> R R version 3.5.2 (2018-12-20) -- "Eggshell Igloo" Copyright (C) 2018 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin15.6.0 (64-bit) ... ... > # if you don't have rJava installed yet, install it > install.packages("rJava") ... ... > library(rJava) > # initialize Java environment > .jinit() > > # we have to tell rJava where to look for our class > .jaddClassPath(paste(getwd(),"/target", sep = "")) > > # we can create instance of our class > obj <- .jnew("somepackage/StringTest") > > # and call the method with arguments > result <- .jcall(obj, returnSig="Ljava/lang/String;", method="changeString", "Hello world!") > result [1] "I have changed the string: Hello world!" >
Sometimes, it’s hard to say what is the signature of methods (e.g. it may have lots of arguments, strange return type). You can easily find the signature using javap.
> javap -cp target somepackage.StringTest Compiled from "StringTest.java" public class somepackage.StringTest { public somepackage.StringTest(); public java.lang.String changeString(java.lang.String); }
In case you have issues while installing rJava on macOS, make sure to take a look here: R 3.4, rJava, macOS and even more mess ;) and here: R, Java, rJava and macOS adventures.