搜半天,没有搜出来自己能用的,自己搞出来两个能用的方法。

两种方法

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)

注意要加双引号,和换行符,不然到远程那里语句会错误

java嵌入R语言 java调用r语言代码_txt文件


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();

注意:

  1. 代码中content 就是R的语句,好大一串,带注释带画图啥的,我也不懂。
  2. 语句不能有/t,只能有换行的/n,这里要注意。
  3. sink()函数加在最前面就可以,函数需要有个结束标志,不然调用次数多了会报错error:sink stack is full。不怕报错不能用的 不加也行。
  4. txt文件读数据按我的例子可以获取,excel好像是sep = ‘\n’,换成sep = ‘\t’,不过我没试过,这个要自己搜一下。
  5. 获取输出内容可能要不同类型的,这个关注REXP 类就行,打个断点,看看里面有没有要的数据自己改就行。