JAVA调用R语言之Rserve(二)

来源:互联网 发布:在香港用淘宝 编辑:程序博客网 时间:2024/05/14 11:33

        之前,我写了一篇文章是java调用R语言之Rserve,但我发现那种方法比较麻烦。后来我发现了一个比较方便的方法,所以今天从又写了一篇博客,来简单说说。

         这次我们需要写一个简单的R语言脚本,然后通过运行这个R脚本,来打开Rserve服务。这样的话,我们每次运行Java程序之前就不用先打开R,再输入程序打开Rserve服务。这样是不是很简单方便。今天我们要用这种方法,和R语言的demo()函数,画一个简单的词云。

首先,我们建一个R脚本:

library(Rserve)Rserve()</span>


我将它保存成Rserve.R文件,放在了这个目录下(MyScript这是我自己新建的文件夹):    D:\Program Files\R\R-3.3.1\MyScript

提示:路径最后不要有中文字符,就是有的时候可能不识别,或包其他错误。

首先我们要导入  包,大家可以查看我的另一篇博文。我们新建一个类,用来初始化Rserve服务。代码如下

package rserve;import javax.xml.transform.Source;import org.rosuda.REngine.Rserve.RConnection;import org.rosuda.REngine.Rserve.RserveException;/** * 启动Rserve服务 * @author henry wang * */public class Rservel {private  static String R_EXE_PATH="D:\\Program Files\\R\\R-3.3.1\\bin\\Rscript.exe";private static String R_SCRIPT_PATH="D:\\Program Files\\R\\R-3.3.1\\MyScript\\Rserve.R";public static RConnection getRConnection(){try {RConnection rConnection=new RConnection();     return rConnection;} catch (RserveException e) {// TODO: handle exceptionSystem.out.println("正在启动Rserve服务......");try {Runtime rn=Runtime.getRuntime();/* * 不建议写成直接写成rn.exec("R_EXE_PATH R_SCRIPT_PATH"),如果这样学的画前面定义的R_EXE_PATH,R_SCRIPT_PATH会提示 * 这两个变量没有用到 * 运行也许会出错,提示错误如下: * java.io.IOException: Cannot run program "D:\Program": CreateProcess error=2, 系统找不到指定的文件。 */String[] commandArgs={R_EXE_PATH,R_SCRIPT_PATH};    rn.exec(commandArgs); Thread.sleep(5000);} catch (Exception e2) {// TODO: handle exceptione2.printStackTrace();}return getRConnection();}}}</span>


说明:R_EXE_PATH 是Rscript.exe或者R.exe的路径,这两个都可以。R_SCRIPT_PATH是R脚本的路径。

package rserve;import java.awt.Graphics;import java.awt.Image;import java.awt.MediaTracker;import java.awt.Toolkit;import javax.swing.JFrame;import org.rosuda.REngine.REXP;import org.rosuda.REngine.Rserve.RConnection;public class WordCloud extends JFrame{private static final long serialVersionUID=1L;static Image img;public static void main(String[] args) throws Exception{// TODO Auto-generated method stubWordCloud wc=new WordCloud();REXP xp=wc.getRobj();//获得R对象wc.PlotDemo(xp,wc);//错误}private REXP getRobj() throws Exception{RConnection c=Rserve.getRConnection();c.setStringEncoding("utf8");//设置字符编码//返回R的版本REXP Rservesion=c.eval("R.version.string");System.out.println(Rservesion.asString());System.out.println("\n----------绘图演示--------");System.out.println("");REXP xp=c.parseAndEval("jpeg('test.jpg',quality=90)");c.eval("library(wordcloud)");c.voidEval("colors=c('red','blue','green','yellow','purple')");c.parseAndEval(" data(SOTU);wordcloud(SOTU,min.freq=10,colors=colors);dev.off()");xp=c.parseAndEval("r=readBin('test.jpg','raw',3000*3000);unlink('test.jpg');r");return xp;}public void PlotDemo(REXP xp, JFrame f)throws Exception{img=Toolkit.getDefaultToolkit().createImage(xp.asBytes());MediaTracker mediaTracker=new MediaTracker(this);mediaTracker.addImage(img, 0);mediaTracker.waitForID(0);f.setTitle("Test Image");f.setSize(img.getWidth(null),img.getHeight(null));f.setDefaultCloseOperation(EXIT_ON_CLOSE);f.setVisible(true);}public void paint(Graphics g){g.drawImage(img, 0, 0, null);}}

c.parseAndEval(" data(SOTU);wordcloud(SOTU,min.freq=10,colors=colors);dev.off()");这个句子的冒号里面都是一些R语句,只不过每句话后面都有一个分号。


运行结果如下:


参考博客:http://blog.csdn.net/xsdxs/article/details/49886927


转载请注明原文链接:http://blog.csdn.net/wzgl__wh/article/details/52958716

1 0
原创粉丝点击