如何将 return Java class 的对象转换为 R(使用 rjava 包)
How to return Java Object of class into R (with rjava package)
有人在使用 R 并在那里使用 java 代码吗?我的意思是使用 "RJAVA" 包从 R 调用 Java 代码。
我创建了自己的程序包,其中包含 java 代码的 jar 文件。 (比如https://cran.r-project.org/web/packages/helloJavaWorld/vignettes/helloJavaWorld.pdf)
然后我有 .r 文件,我想调用 java 方法。
问题是当我想要 return "Java Object of class" 时。 "I" 作为整数或 "S" 作为字符串都没有问题。我需要 R 中 Java class 的对象才能继续使用它。有可能的?我发现我可以 return Java 具有 return 值 "L" 的对象(例如 "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
错在哪里?有可能 return Java class 的对象到 R 并在那里继续使用它吗?
这是一个例子(我希望完整):
我有一个 java class :
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 returns 一个 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"
有人在使用 R 并在那里使用 java 代码吗?我的意思是使用 "RJAVA" 包从 R 调用 Java 代码。
我创建了自己的程序包,其中包含 java 代码的 jar 文件。 (比如https://cran.r-project.org/web/packages/helloJavaWorld/vignettes/helloJavaWorld.pdf)
然后我有 .r 文件,我想调用 java 方法。 问题是当我想要 return "Java Object of class" 时。 "I" 作为整数或 "S" 作为字符串都没有问题。我需要 R 中 Java class 的对象才能继续使用它。有可能的?我发现我可以 return Java 具有 return 值 "L" 的对象(例如 "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
错在哪里?有可能 return Java class 的对象到 R 并在那里继续使用它吗?
这是一个例子(我希望完整):
我有一个 java class :
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 returns 一个 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"