【问题标题】:rJava: Creating zero-length Java arrays from RrJava:从 R 创建零长度 Java 数组
【发布时间】:2025-12-03 20:40:01
【问题描述】:

我正在寻找 rJava 相当于:

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

我试过了:

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

但是当将它传递给期望 String[]jcall(..., s) 的方法时,rJava 会引发错误。

更新

为了让我的问题更清楚。
当然,我可以轻松地制作一个新的 jar(或修改现有的 jar)来托管一些稍后从 R 调用的 zeroArray() 方法,但我正在寻找一个基于 rJava 的解决方案 ,这意味着使用标准 Java 对象或 rJava 或内部 rJava 函数提供的 jar 文件中的类。

【问题讨论】:

    标签: java arrays r java-native-interface rjava


    【解决方案1】:

    如果我有这样的事情:

    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]) );
            }
    }
    

    方法,createArray 会返回

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

    你可以稍后将其用作空字符串 []

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

    当然,这个也可以

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

    问题是,这是否是您正在寻找的东西。

    更新:

    在那种情况下,也许这对你来说更好?

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

    更新2:

    这个怎么样;)

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

    【讨论】:

    • 谢谢,但我实际上正在寻找 rJava 解决方案。我在帖子更新中更清楚地说明了这一点。抱歉,如果一开始不清楚。
    • 使用public int useArray (String[] ar ) {return ar.length ;} 进行测试并调用.jcall(obj, returnSig="I", method="useArray", array) 返回1,而如果String[] array=new String[0]; 则应该是0
    • .oOo。另一个,从我这边 ;) .oOo.
    • 太棒了!在你知道溶胶之后显然很简单)