从 R 调用 Java

Call Java from R

我想从 R 执行 Java 代码。我使用了 rJava 包,我能够执行 Java 的简单代码,例如创建对象或在屏幕上打印.

   require("rJava")
    .jinit()
    test<-new (J ("java.lang.String") , "Hello World!")

但是我想要做的是从 R 或 CSV 文件发送数据帧并在 Java 中执行代码,然后 return 将输出文件发送到 R。同时,它是在我的情况下很难从 Java 调用 R 代码,因为我想先在 R 中处理 CVS 文件,然后在其上应用 Java 代码并将结果再次 return 到 R来完成分析。

我会按照这里的方式走。

  1. 在R中处理CSV文件

  2. 将此文件保存在某处并确保您知道明确的位置(例如 /home/user/some_csv_file.csv

  3. 在 Java 中创建适配器 class 将具有方法 String processFile(String file)
  4. 内部方法 processFile 读取文件,将其传递给 Java 中的代码并进行基于 Java 的处理
  5. 将输出文件存储在某处并且return它的位置
  6. 在R内部,得到processFile方法的结果,在R
  7. 中做进一步的处理

至少,这就是我为您的问题的解决方案的初稿所做的。

更新

我们需要Java文件

// sample/Adapter.java
package sample;

public class Adapter {
  public String processFile(String file) {
    System.out.println("I am processing file: " + file);
    return "new_file_location.csv";
  }

  public static void main(String [] arg) {
    Adapter adp = new Adapter();
    System.out.println("Result: " + adp.processFile("initial_file.csv"));
  }
}

我们要编译它

> mkdir target
> javac -d target sample/Adapter.java
> java -cp target sample.Adapter
I am processing file: initial_file.csv
Result: new_file_location.csv
> export CLASSPATH=`pwd`/target
> R

我们必须从R调用它

> library(rJava)
> .jinit()
> obj <- .jnew("sample.Adapter")
> s <- .jcall(obj, returnSig="Ljava/lang/String;", method="processFile", 'initial_file')
> s
I am processing file: initial_file
> s
[1] "new_file_location.csv"

你的源目录看起来像这样

.
├── sample
│   └──Adapter.java
└── target
     └── sample
         └── Adapter.class

processFile 中,您可以随心所欲地调用现有的 Java 代码。