2015-09-03 6 views
4

Я новичок в программировании R. Я создал простой скрипт R и пытаюсь запустить его с помощью JAVA-класса, но я не могу этого сделать.Сценарий Run R с использованием JAVA-программы

Я пробовал использовать Rserve, а также rJava. Используя Rserve, выполнение кода прекратилось после создания экземпляра «RConnection», тогда как использование исключения rJava «java.lang.UnsatisfiedLinkError: jri.dll: Невозможно найти зависимые библиотеки».

код класса JAVA, как показано ниже:

Для rJava:

import org.rosuda.JRI.Rengine; 
public class Temp { 

public static void main(String a[]) { 
    // Create an R vector in the form of a string. 
    String javaVector = "c(1,2,3,4,5)"; 

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

    // The vector that was created in JAVA context is stored in 'rVector' which is a variable in R context. 
    engine.eval("rVector=" + javaVector); 

    //Calculate MEAN of vector using R syntax. 
    engine.eval("meanVal=mean(rVector)"); 

    //Retrieve MEAN value 
    double mean = engine.eval("meanVal").asDouble(); 

    //Print output values 
    System.out.println("Mean of given vector is=" + mean); 

} 
} 

Для Rserve:

import org.rosuda.REngine.REXPMismatchException; 
import org.rosuda.REngine.Rserve.RConnection; 
import org.rosuda.REngine.Rserve.RserveException; 
public class Temp { 

public static void main(String a[]) { 
    RConnection connection = null; 
    System.out.println("line 10"); 
    try { 
     // Create a connection to Rserve instance running on default port 6311 

     System.out.println("line 15"); 
     connection = new RConnection(); 
     System.out.println("line 17"); 
     //Note four slashes (\\\\) in the path 
     connection.eval("source('D:\\\\RExamples\\\\helloworld.R')"); 
     System.out.println("line 19"); 
     int num1=10; 
     int num2=20; 
     int sum=connection.eval("myAdd("+num1+","+num2+")").asInteger(); 
     System.out.println("The sum is=" + sum); 
    } catch (RserveException e) { 
     e.printStackTrace(); 
    } catch (REXPMismatchException e) { 
     e.printStackTrace(); 
    } 
} 
} 

Пожалуйста, дайте мне знать, если мой вопрос не ясно, или если вы хотите узнать что-нибудь еще. Заранее спасибо.

+0

Как вы настроили RConnection()? Похоже, вам нужно исследовать конфигурацию. Возможно, установите контрольную точку внутри конструктора RConnection(), чтобы проверить соединение. – Craig

+0

Вы можете сказать мне и другой способ. Я получил этот код от Google. – Tiya

ответ

0

Вы просто хотите вызвать внешнее приложение: не будет работать следующее:

Runtime.getRuntime().exec("Rscript myScript.R"); 

Заслуга stackoverflow itself

+0

Не могли бы вы рассказать мне, как я могу это использовать. Поскольку, используя это в классе java, он ничего не показывает. – Tiya

+0

Вы можете запустить свой скрипт так, чтобы он записывал вывод в файл csv. Позже вы можете прочитать этот файл для вывода скрипта. Прочтите данную ссылку для получения более подробной информации. – Canicious

2

Есть два других подхода для подключения Java и R.

Если вы хотите использовать ИСР, вы должны начать Java программу с помощью параметра JVM -Djava.library.path, указывая на папку, содержащую библиотеку JRI.

Например:

$JAVA_HOME/bin/java -Djava.library.path=/app/vendor/R/lib/R/library/rJava/jri/ -jar target/myapp.jar 

Если у вас возникли проблемы с поиском каталога установки ИСР, попробуйте искать ИСР SO библиотеки:

find/-name "libjri.*" 

Кроме того, убедитесь, что вы создали R_HOME и LD_LIBRARY_PATH в вашей среде:

  • R_HOME: Указав на вашей локальной установки R (Ej: /Library/Frameworks/R.framework/Resources)
  • LD_LIBRARY_PATH: Указывая в папку Lib R, а также каталог ИСР (EJ: $ LD_LIBRARY_PATH:/приложение/продавец/R/Lib/R/Библиотека:/приложение/поставщик/R/Lib/R/бен)

с другой стороны, если вы хотите использовать Rserve, вам нужно начать Rserve в отдельных процесс, а затем создать RConnection из вашего java-процесса.

Например:

 if(LOGGER.isInfoEnabled()) { 
      LOGGER.info("Starting RServe process..."); 
     } 
     ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", String.format("echo 'library(Rserve);Rserve(FALSE,args=\"--no-save --slave --RS-conf %s\")'|%s --no-save --slave", rserveConf, rexe)); 
     builder.inheritIO(); 
     Process rProcess = builder.start(); 

     if(LOGGER.isInfoEnabled()) { 
      LOGGER.info("Waiting for Rserve to start..."); 
     } 
     int execCodeResult = rProcess.waitFor(); 

     if(execCodeResult != SUCCESS_CODE) { 
      LOGGER.error(String.format("Unexpected error code starting RServe: %d", execCodeResult)); 
     } else { 
      LOGGER.error("RServe started successfully"); 
     } 

     if(LOGGER.isInfoEnabled()) { 
      LOGGER.info("Opening connection to RServe daemon...."); 
     } 
     REngine engine = new RConnection(); 
     if(LOGGER.isInfoEnabled()) { 
      LOGGER.info(String.format("Obtaining R server version: %d", ((RConnection)engine).getServerVersion())); 
     } 
     //Perform some engine.parseAndEval("...."); 

rserveConf путь к файлу конф Rserv и REXE полный путь к исполняемому файлу R.

Например, в моем компьютере MacOS я могу начать Rserve выполнения этой строки:

/bin/sh -c "echo 'library(Rserve);Rserve(FALSE,args=\"--slave --RS-conf /Users/me/Documents/test/rserve.conf\")'|/Library/Frameworks/R.framework/Versions/3.2/Resources/bin/exec/R --no-save --slave" 

Эта команда выводит что-то вроде этого:

Starting Rserve: 
    /Library/Frameworks/R.framework/Resources/bin/R CMD /Library/Frameworks/R.framework/Versions/3.2/Resources/library/Rserve/libs//Rserve --slave 

Rserv started in daemon mode. 

Обязательно укажите "--slave" параметр когда вы начинаете Rserve.

Если вы хотите увидеть больше примеров, у меня есть демонстрационный проект, использовать оба подхода, ИСР и заповедник, в в моем GitHub:

https://github.com/jfcorugedo/RJavaServer

+0

Большое спасибо за ответ. Я могу запустить свою программу, но теперь у меня есть другая проблема. Пожалуйста, просмотрите http://stackoverflow.com/questions/32581591/run-rscript-from-spring-mvc-with-wildfly-9 – Tiya

+0

Я тоже ответил на этот вопрос – jfcorugedo

0

Альтернативой является использование пакета OpenCpu АиР. Это очень простой сервер (к сожалению, однопоточный), который получает вызовы r-функций по HTTP и возвращает результат в качестве ответа.

Я использовал его для взаимодействия с java.