如何将类的Java对象返回到R(使用rjava包)

时间:2016-10-07 08:57:18

标签: java r rjava

是否有人正在使用R并在那里使用java代码?我的意思是使用“RJAVA”包从R调用Java代码。

我创建了自己的包,在那里我有java代码的jar文件。 (就像那里https://cran.r-project.org/web/packages/helloJavaWorld/vignettes/helloJavaWorld.pdf

然后我有.r文件,我想调用java方法。 问题是当我想返回“类的Java对象”时。 “I”作为整数或“S”作为字符串没有问题。我需要R中的类的Java Object继续使用它。有可能的?我发现我可以返回带有返回值“L”的Java Object(例如“Ljava / lang / Object”)但它不起作用。

这是我调用java代码的R代码:

FCA <- function(){

    a <- .jnew("fcamp/test/MainTest")  
    b <- .jcall(a, "S", "testFunction")
    c <- .jcall(a, "Lfcamp/input/Context;", "testFunction2")

    return(c) 
}

这是我的错误:

Error in .jcall(a, "Lfcamp/input/Context;", "testFunction2") : 
method testFunction2 with signature ()Lfcamp/input/Context; not found

错误在哪里?可以将类的Java Object返回给R并继续在那里工作吗?

1 个答案:

答案 0 :(得分:1)

这是一个例子(我希望完成):

我有一个java类:

package hello;

    public class Hello extends Object {

        public String sayHello2(String name) {
            String result = new String("Hello " + name);
            return result;
        }

        public Hello sayHello3(String name) {
            String result = new String("Hello " + name);
            return new Hello();
        }

    } 

sayHello3返回一个Hello对象。

创建一个jar:

   java -cp .   hello/Hello.java
    jar cvf Hello.jar hello/Hello.class

在我的R会话中:没有java引用的调用

library(rJava)
.jinit()
.jaddClassPath(dir( "path to jar", full.names=TRUE ))
.jclassPath()  # you should see your jar
hjw <- .jnew("Hello")     # create instance of hell/Hello class

outRef <- .jcall(hjw, "S", "sayHello2", "toto", evalString = FALSE)
.jstrVal(outRef)

[1] "Hello World"

调用返回java引用的函数:

outRef2 <- .jcall(hjw, "Lhello/Hello;", "sayHello3", "Universe", evalString = T)
.jstrVal(outRef2)
outRef3 <- .jcall(outRef2, "S", "sayHello2", "New Universe", evalString = FALSE)
.jstrVal(outRef3)

返回:

"hello.Hello@74a14482"
"Hello New Universe"