antonio
antonio

Reputation: 11130

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.

Upvotes: 0

Views: 228

Answers (1)

Oo.oO
Oo.oO

Reputation: 13385

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
>

Upvotes: 1

Related Questions