从R调用Java

时间:2017-10-10 12:56:45

标签: r rjava

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

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

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

1 个答案:

答案 0 :(得分:1)

我会在这里跟进。

  1. 处理R

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

  4. 在Java中创建具有方法String processFile(String file)
  5. 的适配器类
  6. 内部方法processFile读取文件,将其传递给Java中的代码并执行基于Java的处理
  7. 将输出文件存储在某处并返回其位置
  8. 在R中,获取processFile方法的结果并在R
  9. 中进行进一步处理

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

    <强>更新

    我们需要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代码。