簡體   English   中英

使用rJava在R中顯示Java控制台輸出

[英]Display Java console output in R using rJava

我創建了以下Java類並將其保存為Test.java ,然后使用javac Test.java在命令行上編譯為Test.class

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

我在某處讀到的原因是Java中的System.out.println寫入stdout ,是否在R控制台中顯示它取決於解釋器。 例如,輸出顯示在Unix系統上,但不顯示在Windows或knitr中。

我的問題:

  1. 以上解釋是否正確?
  2. 無論操作系統或解釋器如何,如何可靠地捕獲或顯示R中System.out.println的輸出?
  3. 如果那是不可能的,那么設計有關Java當前計算和進度的狀態消息的更好方法是什么,以便R可以顯示這些消息? 謝謝!

我會回答我自己的問題......看起來RJava人實際上提供了一個內置的解決方案(感謝Simon Urbanek如果你讀到這個)。 在Java代碼的一側,有LGPL許可JRI.jar ,這與rJava交付(看jri在子目錄rJava在您的本地研發庫路徑包目錄),並可以復制/提取進入Java庫路徑。 它只有82kb,所以重量很輕。

JRI提供了Java中默認打印流的替代品。 實質上,您將系統輸出重定向到JRI提供的RConsoleOutputStream 上面我的問題中的代碼可以修改如下,以打印到R控制台而不是stdout。

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;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM