Библиотеки R не загружаются с использованием JRI в Java

Я пытаюсь прочитать excel, используя r в Java, используя JRI (JAVA R INTERFACE), но он не работает. Я перечислил некоторые ошибки, которые, как мне кажется, могут быть причиной:

  1. Библиотеки R загружены неправильно.

  2. Ошибка в расположении файла(из-за разделителей).

  3. Неверный метод загрузки библиотек.

КОД -

    package pkg;

    import java.io.File;

    import org.rosuda.JRI.REXP;
    import org.rosuda.JRI.Rengine;
    public class Read {


    public static void main(String args[]) {

    // Start Rengine.
    Rengine engine = new Rengine(new String[] { "--no-save" }, false, null);




    //printing the packages in library
    System.out.println("R_HOME =" + System.getenv("R_HOME"));
      String path =System.getenv("R_HOME") + "\\library" ;
       File folder = new File(path);
      File[] listOfFiles = folder.listFiles();

        for (int i = 0; i < listOfFiles.length; i++) {
          if (listOfFiles[i].isFile()) {
            System.out.println("File " + listOfFiles[i].getName());
          } else if (listOfFiles[i].isDirectory()) {
            System.out.println("Directory " + listOfFiles[i].getName());
          }
        }


    //calling required libraries
   String librarylocation= engine.eval(".libPaths()").asString();
   System.out.println("location of the R libraries:" + librarylocation);



   //to check whether engine is actually working
   Double d= engine.eval("x=mean(c(1,2,3))").asDouble();
   System.out.println("Mean obtained:" + d);


   //checking the working directory 
   String workingdirectory= engine.eval("getwd()").asString();
   System.out.println("location of the working directory:"+ workingdirectory);


   //R CODE TO READ EXCEL FILE (NOT WORKING)
   engine.eval("library(rJava)");
   engine.eval("library(xlsxjars)");
   engine.eval("library(xlsx)");
   engine.eval("library(Matrix)");
   engine.eval("excelfile<-read.xlsx(\"C:/Users/aakashs/Desktop/File_Parse/LT257-Refuel 3 March2017.xlsx\",sheetIndex=1,startRow=9,colIndex=c(1,2,3)");



    //PRINTING VALUE TO CHECK IF THE FILE WAS READ (NOT WORKING)       
    REXP data=engine.eval("excelfile[1,1]");
    System.out.println(" value in data frame:"+ data);



   //performing required operations (NOT WORKING BECAUSE OF ABOVE CODE)
   engine.eval("column4<-matrix(nrow(excelfile),1)");
   engine.eval("for(i in 1:(nrow(excelfile))){column4[i]=excelfile[i+1,3]-excelfile[i,3]}");
   engine.eval("column4<-data.frame(column4)");
   engine.eval("finaldata<-cbind(excelfile,column4)");


   //printing the created data frame(NULL OUTPUT)
   REXP datafinal = engine.eval(" finaldata");
   System.out.println("Data table is :" + datafinal);


   //Writing the data frame to an excel file(NO FILE CREATED )
   engine.eval("write.xlsx(finaldata,\"D:\\\\final2.xlsx\"");
   engine.eval("initial=paste('aakash','singhal')");

}

}

ПОЛУЧЕННЫЙ РЕЗУЛЬТАТ-

R_HOME =C:\Program Files\R\R-3.4.1
Directory base
Directory boot
Directory class
Directory cluster
Directory codetools
Directory compiler
Directory datasets
Directory df2json
Directory foreign
Directory graphics
Directory grDevices
Directory grid
Directory KernSmooth
Directory lattice
Directory MASS
Directory Matrix
Directory methods
Directory mgcv
Directory nlme
Directory nnet
Directory parallel
Directory rJava
Directory rjson
Directory rpart
Directory spatial
Directory splines
Directory stats
Directory stats4
Directory survival
Directory tcltk
Directory tools
Directory translations
Directory utils
Directory XLConnect
Directory XLConnectJars
Directory xlsx
Directory xlsxjars
location of the R libraries:C:/Program Files/R/R-3.4.1/library
Mean obtained:2.0
location of the working directory:D:/Eclipse/RandJava
value in data frame:null
Data table is :null

Я пробовал все, что было доступно в стеке по этой проблеме, но, похоже, ничего не работает.


person Aakash    schedule 09.08.2017    source источник


Ответы (1)


Лучший способ использовать сценарии R в Java — использовать их как функцию R. Создайте сценарий R и передайте аргументы соответствующим образом. Это также добавит больше функциональности коду.

Я не прикрепил весь код, но написание всех engine.eval(Strings) в R-скрипте и поиск их в коде работает отлично.

Джава -

engine.eval("source(\"testRun2.R\")");  
engine.eval("testrunfunction(filepath,filelocation)");

R-

testrunfunction<-function(filePath,filelocation)
{
library('rJava')
library('xlsxjars')
library('xlsx')
library('Matrix')
library('xlsx')
excelfile<-read.xlsx(filepath,sheetIndex=1,startRow=9,colIndex=c(1,2,3))
column4<-matrix(nrow(excelfile),1)
for(i in 1:(nrow(excelfile))){column4[i]=excelfile[i+1,3]-excelfile[i,3]}
column4<-data.frame(column4)
finaldata<-cbind(excelfile,column4)
write.xlsx(finaldata,filelocation)
}
person Aakash    schedule 14.08.2017