2016-10-07 74 views
0

是否有人與R一起工作並在那裏使用java代碼?我的意思是使用「RJAVA」包從R調用Java代碼。如何將Java對象的類轉換爲R(使用rjava包)

我創建我自己的包,在那裏我有jar代碼的jar文件。 (像那裏https://cran.r-project.org/web/packages/helloJavaWorld/vignettes/helloJavaWorld.pdf

然後我有.r文件,我想調用java的方法。 問題是當我想返回「Java對象的類」。 「I」作爲整數或「S」作爲字符串沒有問題。我需要R中的Java類對象繼續使用它。有可能的?我發現我可以返回帶有返回值「L」的Java對象(例如「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對象的類返回給R,並繼續在那裏使用它?

+0

如果程序包路徑正確,您的示例應該使用:c < - .jcall(a,「Lfcamp/input/Context;」,「testFunction2」)。您需要以「L」作爲前綴,後綴爲「;」全班名 – tokiloutok

+0

我有「L」和「;」那裏。它仍然不起作用。如果你確定它是正確的,那麼我有可能錯誤的java代碼。謝謝。 –

回答

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) 

返回:

"[email protected]" 
"Hello New Universe" 
+0

謝謝......它幫助我很多! :) 我還有一個問題。如果我需要從java返回類似「List 」的東西,我該怎麼辦?列表有一些返回類型嗎? –

相關問題