Search code examples
javaarraysrjava-native-interfacerjava

rJava: Creating zero-length Java arrays from R


I am looking for the rJava equivalent of:

String[] s;
s= new String[0];

I tried:

library(rJava)
.jinit()
s=.jarray(list(NULL), "[Ljava/lang/String;")

But when passing it to a method expecting a String[] with jcall(..., s), rJava raises an error.

Update

To make my question clearer.
I could, of course, easily make a new jar (or modifying the existing one for) hosting some zeroArray() method to be later called from R, but I am looking for a solution based on rJava, which means using standard Java objects or the classes in jar files shipped by rJava or internal rJava functions.


Solution

  • If I have something like this:

    package utils;
    
    public class RUsingStringArray {
    
            public void useArray(String [] array) {
              for(int i=0; i<array.length; i++ ) {
                String str = array[i];
              }
            }
            public int arrayLen(String [] array) {
                    System.out.println("Class: " + array.getClass());
                    return array.length;
            }
            public String [] createArray() {
                    return new String[0];
            }
            public static void main(String [] arg) {
    
                    RUsingStringArray obj = new RUsingStringArray();
                    obj.useArray(obj.createArray());
                    System.out.println("Len: " + obj.arrayLen(new String[0]) );
            }
    }
    

    method, createArray will return

    > obj <- .jnew("utils.RUsingStringArray")
    > s <- .jcall(obj, returnSig="[Ljava/lang/String;", method="createArray")
    > s
    character(0)
    

    and you can use it as empty String [] later on

    .jcall(obj, returnSig="V", method = "useArray", s)
    

    Of course, this one will work as well

    > b <- character(0)
    > .jcall(obj, returnSig="V", method = "useArray", b)
    

    Question is, whether this is something you are looking for.

    Update:

    In that case, maybe this is something better in your case?

    > array <- .jarray(list(NULL), "java/lang/String")
    > .jcall(obj, returnSig="V", method="useArray", array)
    

    Update2:

    How about this one ;)

    > array2 <- .jarray(character(0), "java/lang/String")
    > .jcall(obj, returnSig="I", method="arrayLen", array2)
    Class: class [Ljava.lang.String;
    [1] 0
    >