Отображение вывода консоли Java в R с использованием rJava - PullRequest
0 голосов
/ 23 января 2019

Я создал следующий класс Java и сохранил его как Test.java, затем скомпилировал в Test.class в командной строке, используя javac Test.java:

public class Test {

  public Test() {
  }

  public double power(double number) {
    System.out.println("calculating...");
    return number * number;
  }
}

Кроме того, я создал следующий Rсценария и сохранил его как test.R:

library("rJava")
.jinit(classpath = getwd())
test <- .jnew("Test")
.jcall(test, "D", "power", 3)

Когда я выполняю его, например, используя R CMD BATCH test.R в командной строке, я получаю следующий вывод, который я и хочу:

calculating...
[1] 9

Однако, когда я обертываю этот скрипт в документ Markdown и компилирую его, используя knitr, я теряю сообщение, которое напечатано о происходящем расчете.Например, я сохраняю следующий скрипт в test.Rmd и компилирую его с помощью RStudio:

```{r echo=TRUE, warning=TRUE, results='show', message=TRUE}
library("rJava")
.jinit(classpath = getwd())
test <- .jnew("Test")
.jcall(test, "D", "power", 3)
```

Это возвращает только следующий вывод без сообщения:

## [1] 9

Я где-то читалпричина в том, что System.out.println в Java записывает в stdout, и будет ли это показано на консоли R или нет, зависит от интерпретатора.Например, выходные данные отображаются в системах Unix, но не в Windows или в knitr.

Мои вопросы:

  1. Верна ли приведенная выше интерпретация?
  2. Как можноЯ надежно фиксирую или отображаю вывод System.out.println в R независимо от операционной системы или интерпретатора?
  3. Если это невозможно, как лучше разработать сообщения о состоянии текущих вычислений и прогресса в Java,такой, что R может отображать эти сообщения?Спасибо!

1 Ответ

0 голосов
/ 27 января 2019

Я постараюсь ответить на свой вопрос ... Похоже, ребята из RJava действительно предлагают встроенное решение (спасибо Саймону Урбанеку, если вы прочитаете это).На стороне Java-кода есть LGPL-лицензия JRI.jar, которая поставляется с rJava (посмотрите подкаталог jri в каталоге пакета rJava в вашем локальном пути к библиотеке R) и которая можетбыть скопирован / извлечен в путь библиотеки Java.Это всего лишь 82 КБ, поэтому достаточно легкий.

JRI предлагает замену потока печати по умолчанию в Java.По сути, вы перенаправляете системный вывод в RConsoleOutputStream, предоставленный JRI.Код в моем вопросе выше может быть изменен следующим образом для вывода на консоль R вместо стандартного вывода.

import java.io.PrintStream;
import org.rosuda.JRI.RConsoleOutputStream;
import org.rosuda.JRI.Rengine;

public class Test {

  public Test() {
    Rengine r = new Rengine();
    RConsoleOutputStream rs = new RConsoleOutputStream(r, 0);
    System.setOut(new PrintStream(rs));
  }

  public double power(double number) {
    System.out.println("calculating...");
    return number * number;
  }
}
...