Как запустить rserve автоматически из Java в Windows

Я создал java-приложение в eclipse. Приложение использовало пакет Rserve для подключения к R и запуска r-скриптов. Перед запуском моего приложения я должен запустить rserve из Rstudio следующим образом:

library(Rserve)
Rserve()

Этот код Java будет упакован в виде исполняемого файла, поэтому есть ли способ, которым Rserve() вызывается автоматически (в Windows) сразу после запуска кода, чтобы я мог пропустить этот ручной шаг запуска Rserve с помощью RStudio?


person R. Haroon    schedule 29.05.2017    source источник


Ответы (2)


Проект https://github.com/yannrichet/rsession поможет вам в этом.

Хотя было бы интересно взглянуть на это: https://github.com/subes/invesdwin-context-r Поскольку он интегрирует RSession и поддерживает пул подключений Rserve по соображениям производительности, вам не нужно много для этого делать. Вы также можете переключиться на другие решения среды выполнения, такие как JRI, RCaller, Renjin, без необходимости изменять код сценария.

person subes    schedule 09.06.2017
comment
Чтобы использовать JRI, мы должны установить путь к различным файлам DLL и jar. Меня беспокоит то, что если я буду использовать свой проект на другом компьютере, мне придется снова сбрасывать все пути? и если я разверну свое приложение, как будет установлен путь? - person R. Haroon; 09.06.2017
comment
Обычно вы помещаете папку исполняемого файла Rscript в PATH приложения, хотя, когда вы посмотрите на rsession, вы увидите, что он дополнительно пытается прочитать папку установки R из реестра, а также пытается найти исполняемый файл по некоторым общим путям. Хотя было бы несложно улучшить библиотеку, чтобы она также позволяла добавлять настраиваемый путь для поиска, поэтому вы можете настроить его с помощью параметра запуска из вашего основного приложения (или, в идеале, скорее системного свойства). - person subes; 10.06.2017
comment
Ах, я заметил, что вы спрашивали о JRI (приведенный выше комментарий был о Rsession), вы также можете убедиться, что библиотека найдена, добавив ее в java.library.path в качестве альтернативы системным свойствам, которые я предоставляю (вы можете переопределить их во время запуска через аргумент командной строки -Dproperty.name=value во время запуска приложения, если вы используете класс AMain, предоставленный проектом Investedwin-context), хотя проблема всегда одна и та же с собственными библиотеками. Именно поэтому я добавил поддержку RCaller, Rserve, Renjin как альтернативу JRI. - person subes; 10.06.2017
comment
Подробнее о механизмах системных свойств, предоставляемых invesdwin-context, можно прочитать здесь: github.com/subes/invesdwin- контекст Также вы можете полностью отключить инициализацию платформы, чтобы развернуть собственное решение. Модули R также работают без инициализации пружинного контекста. - person subes; 10.06.2017
comment
Спасибо вам за всю информацию. Я это проверю - person R. Haroon; 13.06.2017

Я не уверен, есть ли более чистый способ сделать это, но я решил это, запустив консольный стиль из моей java-программы. Чтобы это работало, вы должны указать путь к исполняемым файлам R в системном пути:

public Process rserve = null;

public static void startRServer() throws InterruptedException, IOException {
    // check the runtime environment to see if there's an active Rserve running
    String existingRserve = "";
    try {
        Process p = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq Rserve.exe\"");
        p.waitFor();
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        existingRserve = in.readLine();
    } catch(IOException e){}

    if(rserve == null || existingRserve.contains("No tasks are running")) {
        // start and rserve if we don't have one for this run yet, 
        // or if it has unexpectedly failed since we last used it
        try {
            rserve = Runtime.getRuntime().exec("Rscript -e \"library(Rserve); Rserve()\"");
            rserve.waitFor();
        } catch (IOException e) {
            System.out.print("*** R Error: Unable to start the R server ***");
        }
    }
}
person lolynns    schedule 05.06.2017
comment
Предположим, я указываю путь к исполняемому файлу R в моем системном пути. Теперь, если я использую свой проект на другом компьютере, мне придется сбросить путь? Я спрашиваю, потому что я надеюсь развернуть свое приложение, и я смущен этим. - person R. Haroon; 09.06.2017
comment
К сожалению, для этого метода путь к папке с исполняемым файлом R необходимо поместить в системные переменные среды для каждой машины, на которой запускается эта программа. Я не уверен, есть ли способ сделать это из вашей Java-программы (я думаю, что нет, так как это будет огромная дыра в безопасности... но это возможно) - person lolynns; 27.02.2018