1. 程式人生 > >在R中呼叫Java程式碼

在R中呼叫Java程式碼

      我們都知道Java語言長期處於霸主地位,在所有程式語言排行榜中,Java也是常年位居第一。在近幾年也是爆炸式發展,幾乎覆蓋到了應用開發的所有領域。而R語言則在統計圈和資料視覺化處於佼佼者,如果將Java的通用性和R的專業性緊密結合起來,就可以碰撞出不一樣的火花。

     在之前兩篇文章中我已經寫了如何在Java程式中呼叫R程式碼,連結分別為:

JAVA呼叫R語言之Rserve            http://blog.csdn.net/wzgl__wh/article/details/52793558

JAVA呼叫R語言之Rserve(二) http://blog.csdn.net/wzgl__wh/article/details/52958716

      想必很多人都知道rjava包是一個R語言和Java語言的通訊介面,通過底層JNI實現呼叫,允許R直接呼叫java物件的方法。可今天我就一個簡單的函式system()來實現在R語言直接呼叫Java程式。

public class NoParameter {

	public void printFibo(int n){
		for(int i=1;i<=n;i++){
			System.out.println(f(i)+" ");
			if (i%10==0) {
				System.out.println();
			}
		}	
	}
	long f(long n){
		if (n==1||n==2) {
			return 1;
		} else {
			return f(n-1)+f(n-2);
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new NoParameter().printFibo(5);
	}

}

這段程式碼是用於計算斐波拉契數列的,我已經給了初值為5,執行結果為:


在R語言中,我們只需要用兩句話就可以呼叫這個程式:

system("javac NoParameter.java")#生成.class檔案
system("java NoParameter")#執行NoParameter檔案
執行結果如下:



public class Parameter {

	public void printFibo(int n){
		for(int i=1;i<=n;i++){
			System.out.println(f(i)+" ");
			if (i%10==0) {
				System.out.println();
			}
		}	
	}
	long f(long n){
		if (n==1||n==2) {
			return 1;
		} else {
			return f(n-1)+f(n-2);
		}
	}
	public static void main(String[] args) {
        new Parameter().printFibo(Integer.parseInt(args[0]));
	}

}
    這個程式是需要我們在執行時輸入一個引數才可以繼續執行。



這個在R語言中也需要兩句話就可以執行:
system("javac Parameter.java")
system("java Parameter 6")
執行結果為

這裡需要注意的就是Main函式引數String[] args,它是一個字串陣列,用來接收從命令列輸入的引數。引數之間用空格隔開,java直譯器會自動處理,把用空格隔開的每一個引數通過args陣列傳遞給main方法。引數下標從0開始,args[0]就代表1第一個引數。當然輸入引數之間可以有多個空格,中間的多個空格會被忽略掉。

轉載請註明原文連結:http://blog.csdn.net/wzgl__wh/article/details/55254070