2016-01-05 63 views
0

我有一個Rscript myrscript.R,它具有下面的代碼。如何在Rscript中聲明一個全局變量並從Java調用它

if(exists("e")==FALSE) 
{ 
    e = new.env() 
} 

myfun1<-function(file_path) 
{ 
    mydata<-read.csv(file_path) 

    e$mydata1 =mydata 

    return("firstfunction") 
} 

myfun2<-function() 
{ 
    e$mydata1 
    names_mydata<-colnames(e$mydata1) 
    nm<-names_mydata[1] 

    return(nm) 
} 

我使用下面的代碼從java調用這個腳本。

public class mymainclass { 
    public static void main(String[] args) throws RserveException, REXPMismatchException { 
     String file_path1="/home/jayshree/test_data.csv"; 
     mymainclass mm=new mymainclass(); 
     String s = mm.myfun_2(file_path1); 
     String l3 = mm.myfun_3(); 

     System.out.println(s); 
     System.out.println(l3); 
    } 

    public static String myfun_2(String file_path) throws RserveException, REXPMismatchException 
    { 
     RConnection c = new RConnection(); 
     c.eval("source(\"/home/jayshree/myrscript.R\")"); 
     c.assign("file_path",file_path); 
     String a = c.eval("myfun1(file_path)").asString(); 
     return(a); 
    } 

    public static String myfun_3() throws RserveException, REXPMismatchException 
    { 
     RConnection c = new RConnection(); 
     c.eval("source(\"/home/jayshree/myrscript.R\")"); 
     String b = c.eval("myfun2()").asString; 

     return(b); 
    } 
} 

從java運行這個。它拋出了不匹配的錯誤。錯誤是因爲在調用R腳本的第二個函數時發生的。全局變量e $ mydata1的值未被初始化,並且爲空。但它不應該。我在R控制檯中運行腳本文件的代碼。它運行良好。但是,當從java調用時,爲什麼全局變量不起作用。有沒有其他的解決方案。

+0

'myfun2'接受參數'file-path',它不是一個有效的R變量名稱。 –

+0

對不起,這是輸入錯誤 –

回答

1

您每次都創建一個新連接,因此這些調用是完全獨立的。即,在myfun_3中,您將啓動一個空的新R會話,因此預計它不會加載任何數據。如果要使這些功能在同一個會話中工作,則必須使用相同的RConnection對象。

+0

其實上面的代碼只是試圖在Rserve環境中設置一個全局變量。我正在構建一個應用程序,我已經閱讀了csv文件並執行了一些分析並返回結果。由於每次我需要從csv獲取數據時,我無法設置全局變量。數據文件大小約爲1 GB。 –

+0

現在我可以在Rserve環境中設置全局變量,但出現錯誤「OutOfMemoryError:Java heap space」我的代碼適用於小型csv文件,但不適用於大型文件。我使用的是os-centos6.5,netbeans8.1,java1.7,R3.2和glassfish-4.1.1。我在谷歌搜索解決這個問題,我嘗試了每種溶劑,但仍然得到相同的錯誤。 –

+0

我的確喜歡這樣,它適用於小數據集,但不適用於大數據。這是一個示例。 RConnection c = new RConnection(); c.eval(「source(\」/ home/jayshree/Desktop/return_data2.R \「)」); RList a = c.eval(「x << - return_dataframe_2()」)。asList(); c.eval(「source(\」/ home/jayshree/Desktop/return_data2.R \「)」); String [] b = c.eval(「return_column_names(x)」)。asStrings(); –