2010-02-01 38 views
13

Cách tốt nhất để gọi chức năng R từ bên trong Java là gì?R từ bên trong Java

Tôi đang tìm cách nhanh chóng, dễ dàng và đáng tin cậy để tạo các biểu đồ phân tán 2d tiêu chuẩn và biểu đồ trong R bằng cách sử dụng các ứng dụng Java của tôi. Tôi đã tự hỏi những gói/giao diện nào xuất hiện trong tìm kiếm nhanh của Google sẽ thuận tiện nhất để sử dụng.

Tôi mong được đề xuất của bạn!

+4

Trùng lặp: http://stackoverflow.com/questions/1136709/extend-my-java-application-with-r – Shane

Trả lời

15

Sử dụng JRI: http://www.rforge.net/JRI/. Nó đi kèm với rJava, bao gồm một số ví dụ về cách sử dụng.

Một ví dụ rất đơn giản sẽ là như thế này:

import java.io.*; 
import java.awt.Frame; 
import java.util.Enumeration; 

import org.rosuda.JRI.Rengine; 
import org.rosuda.JRI.REXP; 
import org.rosuda.JRI.RVector; 
import org.rosuda.JRI.RMainLoopCallbacks; 

public class rJavaTest { 

    public static void main(String[] args) { 

     Rengine re=new Rengine(args, false, new TextConsole()); 
     REXP x; 
     re.eval("print(1:10/3)"); 
     System.out.println(x=re.eval("iris")); 
     RVector v = x.asVector(); 
     if (v.getNames()!=null) { 
      System.out.println("has names:"); 
      for (Enumeration e = v.getNames().elements() ; e.hasMoreElements() ;) { 
       System.out.println(e.nextElement()); 
      } 
     } 

     if (true) { 
      System.out.println("Now the console is yours ... have fun"); 
      re.startMainLoop(); 
     } else { 
      re.end(); 
      System.out.println("end"); 
     } 
    } 
} 
+6

bạn đã nhận được TextConsole() bạn đã chuyển làm thông số cho Rengine từ đâu? Tôi không thể biên dịch chương trình này vì nó. –

+0

Tôi không nghĩ rằng một ví dụ không đầy đủ (không cần câu lệnh 'import') cần được chọn làm câu trả lời được chấp nhận. @Shane: nếu bạn có thể, hãy lấp đầy khoảng trống của ví dụ bạn đã cung cấp. – Giupo

+0

JRI có thư mục con 'example', nơi bạn có thể xem các ví dụ hoàn chỉnh hơn. Trong 'rtest.java' bạn sẽ tìm thấy ở trên với rất nhiều công cụ bổ sung và cũng tìm thấy thiếu lớp' TextConsole thực hiện RMainLoopCallbacks {...} ' – RolandASc

3

Tôi đã phát hiện ra rằng forking R như một quá trình, gắn với suối stdin, stdout, và stderr của quá trình, và gửi R lệnh qua input stream khá hiệu quả. Tôi sử dụng hệ thống tập tin để giao tiếp giữa R và quá trình Java của tôi. Bằng cách này, tôi có thể có nhiều tiến trình R chạy từ các luồng khác nhau trong Java và môi trường của chúng không xung đột với nhau.

+2

Bạn có thể có nhiều phiên bản JRI chạy trong các luồng riêng biệt và sẽ không có cuộc xung đột. – Shane

4

Có một cái gì đó mới gọi là http://www.renjin.org/

Một điều tôi thích nó hơn JRI là triển khai, khi jri đòi hỏi người sử dụng ứng dụng của bạn sẽ tải R, renjin không, và nó chỉ sử dụng JVM để chạy.

Các vấn đề liên quan