JAVA调用R语言之Rserve(二)

        之前,我写了一篇文章是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 exception
			System.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 exception
				e2.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 stub
		WordCloud 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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页