一、 實訓內容
- 利用R語言對Java項目程序進行調用,本實驗包括利用R語言對java的.java文件進行編譯和執行輸出。
- 在Java中調用R語言程序。本實驗通過eclipse編寫Java程序的方式,調用R語言的腳本文件進行傳值運算,並將執行后的結果返回給Java程序。
二、 實驗課題目標
- 要求能在R x64 3.6.1程序中進行簡單的工作空間切換功能,以及掌握基本的shell.exec()和system()函數的應用。
- 掌握在R語言中進行包的下載和加載的方法,以及啟動Rserve服務的方法。
- 掌握R語言與Java相互調用的基本原理和實現方法。
三、 實驗平台
1、 系統: Windows 10
Intel(R) Core(TM)i7-7500U CPU @ 2.70GHz 2.90 GHz
RAM 8.00GB
2、工具:
R x64 3.6.1
notepad.exe
eclipse
word 2016
四、 實施步驟
(1)、R語言調用Java項目程序
1、 切換R語言的工作空間。
首先在C:\目錄下,新建文件夾為workspace,再打開R x64 3.6.1程序,輸入命令:getwd() ,獲取當前R語言程序的工作空間。輸入如命令:setwd("C:/workspace") ,將workspace作為R語言的工作目錄,再加以驗證是否切換成功。

圖4-1 切換工作空間
2、 編寫Java程序。
在R x64 3.6.1程序中,輸入命令:shell.exec("notepad") ,打開記事本,編寫相應的Java類文件,並保存到C:\ workspace目錄下,命名為demo.java。

圖4-2 R語言打開notepad

圖4-3 Java代碼示例
3、 使用R語言編譯Java源文件。
首先,這里以demo.java文件,雖然只有一個.java格式的文件,但是也可以將其理解為一個簡單的Java項目。在R x64 3.6.1程序中,輸入命令:system("javac demo.java") ,編譯C:\ workspace目錄下的demo.java文件。

圖4-4 編譯Java文件成功
當在返回的結果中看到[1] 0 ,則表示已經成功進行了編譯。如圖4-5所示,在C:\ workspace目錄下,已經成功生成了demo.class字節文件,也再次驗證了編譯過程中沒有錯誤。

圖4-5 編譯結果生成文件
4、 使用R語言運行已經編譯的demo.class文件。在R x64 3.6.1程序中,輸入命令:system("java demo") ,執行剛編譯好的demo.class字節文件。

圖4-6 執行成功
很明顯,在返回的結果中顯示:“利用R語言成功調用Java程序! [1] 0”的字樣,這表示R語言成功調用了經過編譯的Java項目程序。這里雖然是以簡單的單個.java文件做實驗,但即使Java項目文件再多,此方法都可以使用。
(2)、Java中調用讓語言程序
1、安裝Rserve包。在R x64 3.6.1程序中,輸入命令:install.packages("Rserve") ,下載‘Rserve’程序包。在彈出的mirrors選項中,選擇上海的服務器即可。

圖4-7 Rserve下載成功
2、加載Rserve包。輸入命令:library(Rserve) ,加載Rserve程序包。
3、啟動服務。輸入命令:Rserve() ,開始啟動Rserve服務。

圖4-8 Rserve服務開啟成功
4、編寫調用R語言的Java程序。打開eclipse,新建項目為demo。同時,在demo項目工程名稱上右擊,選擇“Build Path”-“Configure Build Path..”。在Libraries
選項卡中,單擊Add External JARs.. ,加載2、3步驟中下載的REngine.jar和Rserve.jar文件

圖4-9成功加載Rserve包
5、 編寫demo類文件。具體示例代碼如下:
package demo; import org.rosuda.REngine.Rserve.RConnection; import org.rosuda.REngine.Rserve.RserveException; import org.rosuda.REngine.REXPMismatchException;; public class demo { public static void main(String[] args) throws REXPMismatchException { RConnection connection = null; System.out.println("平均值"); try { connection = new RConnection(); String vetor = "c(1,2,3,4)"; connection.eval("meanVal<-mean(" + vetor +")"); double mean = connection.eval("meanVal").asDouble(); System.out.println("the mean of given vector is=" + mean); } catch (RserveException e) { e.printStackTrace(); } System.out.println("執行腳本"); try { connection.eval("source('c:/ workspace/myAdd.r')"); int num1 = 20; int num2 = 10; int sum = connection.eval("myAdd(" + num1 + "," + num2 + ")").asInteger(); System.out.println("the sum=" + sum); } catch (RserveException e) { System.out.println(e); e.printStackTrace(); } connection.close(); } }
6、 在c:\workspace目錄下新建myAdd.r腳本,腳本內容如圖所示:

圖4-10 myAdd.r腳本
7、 在eclipse中運行該工程的主類文件,運行結果如圖4-11所示:

圖4-11 執行成功
明顯,在返回的結果中,有以下信息:“the mean of given vector is=2.5
執行腳本 the sum=30 ”,這正是Java程序調用R語言執行后,返回的結果。
五、 實驗成果
(1)、R語言調用Java項目程序
在實驗步驟中,利用R對編譯的demo.class字節文件進行執行時,成功返回如圖5-1所示的內容,即“利用R語言成功調用Java程序! [1] 0”,表明利用R語言成功運行了Java項目程序。同時,隱含性地表明R語言可以調用Java語言,對.java文件進行編譯和執行。

圖5-1 R語言成功調用Java
(2)、Java中調用R語言程序
當在eclipse中運行調用R腳本的主類時,在執行反饋信息中,返回了:“the mean of given vector is=2.5 執行腳本 the sum=30 ”。這計算結果,需通過R語言進行,也就是說Java也成功調用了R語言,即調用R語言腳本進行運算。如圖5-2所示:

圖5-2 Java調用R語言程序成功
六、 實訓總結
本實驗的經驗收獲和總結,可分點總結如下:
- 在利用Java調用R語言腳本時,需要加載REngine.jar和Rserve.jar兩個jar包。而這兩個jar包來源於,在中R x64 3.6.1使用install.packages("Rserve") 的方式進行下載Rserve。
- 在服務端計算機安裝R之后可以直接使用install.packages(“Rserve”)進行安裝。需要使用時在R控制台下加載該包,然后輸入命令Rserve(),開啟服務器就可以供客戶端調用。
- 在實現R語言調用java的過程中,也可以使用rjava包,其是一個R語言和Java語言的通信接口,通過底層JNI實現調用,允許R直接調用java對象的方法。而本實驗,利用簡單的函數system()來實現在R語言直接調用Java程序。
- 在R語言調用java的時候,也可以進行傳值類型的調用。即:Main函數參數String[] args,它是一個字符串數組,用來接收從命令行輸入的參數。
參數之間用空格隔開,java解釋器會自動處理,把用空格隔開的每一個參數通過args數組傳遞給main方法。參數下標從0開始,args[0]就代表1第一個參數。當然輸入參數之間可以有多個空格,中間的多個空格會被忽略掉。
