搜半天,没有搜出来自己能用的,自己搞出来两个能用的方法。
两种方法
R语言和Rserver的安装方法网上能搜出来,注意开启Rserver之前要提前配置好R的path环境变量,不然win控制台识别不了命令。
第一种方法
这个是google搜的,实测也算能用,不过我的R语句可能有点复杂用不了。
capture.output( {command} )
在output中放要执行的命令
例如:
RConnection r = new RConnection("192.168.1.1");
String str = r.eval("capture.output(R.version.string)").asString();
r.close();
这种有个缺点,简单的可以执行,比如循环什么的,复杂的不行。计算一个数据感觉可以用这种方法,可以自己试试,这种简单。
第二种方法
网上找了好久也没有解决,最后看了R语言的sink()方法可以把R控制台的输出内容保存到一个文件,然后再通过read.table()方法读出来内容就可以返回了。这种方法也算解决了我的需求。
sink("output.txt",append = FALSE,split = FALSE)
或指定路径
sink("D:\\output2.txt",append = FALSE,split = FALSE)
注意要加双引号,和换行符,不然到远程那里语句会错误
append:取TRUE表示若当前目录下有与结果文件同名的文件,则本程序的计算结果将追加到原文件内容的后面,取FALSE表示将本程序的计算结果覆盖原文件的内容;
split:取TRUE表示在计算结果输出到指定文件中的同时,还输出到控制台上,取FALSE表示计算结果仅输出到指定文件中。
我的需求是只要这一次结果,结果会存到日志表里,所以我两个都是false。文件名和类型根据自己需求定义,可以指定路径,不指定会在工作的目录下创建 output.txt 文件。
#####################################################
给个例子:
RConnection r = new RConnection("192.168.1.1");
String content = model.getContent().replaceAll("[\\r]", "");
//结尾必须加sink()表示结束,不然调用次数多了会报错error:sink stack is full
String statement = "sink(\"output.txt\",append = FALSE,split = FALSE)\n" + content + "\nsink()";
r.eval(statement);
REXP eval = r.eval("read.table(\"output.txt\",sep = '\n',head=FALSE)");
Map<String, String[]> map = (Map) eval.asNativeJavaObject();
StringBuilder valueStr = new StringBuilder();
Arrays.stream(map.get("V1")).forEach(s -> valueStr.append(s + "\n"));
//result就是R控制台输出的内容
String result = valueStr.toString();
r.close();
注意:
- 代码中content 就是R的语句,好大一串,带注释带画图啥的,我也不懂。
- 语句不能有/t,只能有换行的/n,这里要注意。
- sink()函数加在最前面就可以,函数需要有个结束标志,不然调用次数多了会报错error:sink stack is full。不怕报错不能用的 不加也行。
- txt文件读数据按我的例子可以获取,excel好像是sep = ‘\n’,换成sep = ‘\t’,不过我没试过,这个要自己搜一下。
- 获取输出内容可能要不同类型的,这个关注REXP 类就行,打个断点,看看里面有没有要的数据自己改就行。