Java-调用R语言和调用Python(前后端展示)

1. 背景

  1. R语言和Python用于数据分析和数据处理,并生成相应的直方图和散点图
  2. 需要实现一个展示平台,后端使用Java,分别调用R语言和调用Python,并返回数据和图给前端显示
  3. 这个平台主要实现多维度数据的特征选择,以及数据集协变量偏移(Covariate shift)的纠正的功能
  4. 本质就是一个Java调用R语言以及Java调用Python的Demo,做得很简单,大神勿喷

2. 技术栈

  • Java 用的是 Springboot
  • R语言
  • Python
  • 前端用的是 Vue + ElementUI (前端只会点皮毛)
  • MySQL

3. Java调用R语言

3.1 R语言安装Rserve服务器

在这之前需要分别对Java和R做些准备,首先是R语言安装Rserve服务器
Java调用R语言时,Rserve需要启动,可以通过CMD命令行 / RStudio 执行

安装Rserve
install.packages("Rserve")
载入Rserve
library(Rserve())
启动Rserve
Rserve()

这里使用CMD命令行展示启动Rserve,这样完成了Java调用R语言的第一步

Java-调用R语言和调用Python(前后端展示)

3.2 Springboot添加Rsession依赖

添加Rsession依赖之后就可以直接调包了


   com.github.yannrichet
   Rsession
   1.8.3

3.3 Java调用R常用命令

这里演示一些我需求中Java调用R的一些方式,其中包括一些比较常用的方法
Java调用R的基本指令、R的图片如何保存并返回、R的结果如何获取和过滤等

/**
* 这里是Java调用R语言,R语言对多维度的数据进行特征选择,并将特征选择的结果返回,写入MySQL
**/
public List> featureSelection(){
    RConnection c = null;// RConnection用于和Rserve建立连接
    try{
        c = new RConncetion();// 建立连接

        String RPath = "../featureSelection.R";// R文件的地址

        c.assign("path",Rpath);// assign命令是将Rpath添加到R中,命名为path

        c.eval("source(path)");// eval命令是执行R命令,这里则是执行source方法根据路径加载R文件

        String Dpath = fileMapper.selectFilePath("train",1);// 通过MySQL获取数据集路径

        String str = "rfProfile > stringStringMapList = handlerRresults.catchAndHandlerR(feature, imptScores);
        fileMapper.deleteFileInfo(-1,"train");//-1 文件已使用
        String featsStr = handlerRresults.getFeatsStr(feature);
        featMapper.insertFeat(featsStr);
        return stringStringMapList;
    } catch (RserveException | REXPMismatchException e) {
        e.printStackTrace();
    } finally {
        c.close(); // 一定要这一行!!!用完一定要关!!!
    }
    return null;
}

总结一个简易的Java调用R的模板,R语言是按行执行的,无情eval()

public void JavaCallRDemo(){
    RConnection c = null;
    try{
        c = new RConnection();

        c.assign();//通过Java添加变量至R

        c.eval();//Java执行R命令

    } catch (RserveException | REXPMismatchException e) {
        e.printStackTrace();
    } finally {
        c.close();
    }
}

3.4 Java调用R的特征选择前端演示

我的数据集是30维的,结果选取了其中5个特征(Best trade-off)
这里将特征及其对应的重要性得分通过表格的形式展示
图片则是通过Base64转码的方式传给前端

Java-调用R语言和调用Python(前后端展示)

4 Java调用Python

4.1 Java调用Python代码部分

Java调用Python,我使用的是Process类并通过Runtime调用其他进程
Runtime可以调用cmd、shell等,这里我以我的项目为例稍作演示

/**
* Java使用Runtime调用python
**/
public String callPy(){
    StringBuffer arr = new StringBuffer();// 用于获取结果
    String basePath = "d://fileAndData/process/";// demo都是将文件直接存本地了,图方便

    // 以下为调用Python时传递的参数
    String featName = featMapper.getFeat();
    String trainPath = fileMapper.selectFilePath("train",-2);
    String ptrainPath = basePath + fileMapper.selectFileName("train",-2);
    String ptestPath = basePath + fileMapper.selectFileName("test",-2);

    Process proc; //声明一下Process
    try{
        // 字符串数组保存一下调用命令:1.使用python3 2.调用某个.py文件 3-6.传递的参数
        String[] args = new String[]{"python3","../kmm.py",featName,trainPath,ptrainPath,ptestPath};

        proc = Runtime.getRuntime().exec(args);// 调用命令,cmd方式

        BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));// 得到输入流

        String line = null;
        while((line = in.readLine())!=null){
            arr.append(line).append("\n");// 写入
        }
        in.close();
        proc.waitFor();
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
    return arr.toString();
}

由于在我这个Demo中,Python脚本执行完成后的结果全是散点图
我的做法是python直接把图保存本地,python执行完成后调用接口通过Base64格式传给前端
后来发现其实也可以直接将返回的Base64格式的图片丢给前端,不用那么麻烦

/**
* 这里是一个我用于获取某个文件夹下所有文件,并转为Base64格式的方法
* 因为我文件夹下只会有图片,我Demo也就只做了一个判空校验,直接开干
* Controller层
**/
public List getPyFigsListBase64(HttpServletResponse response){
    String pyFilePath = "d://fileAndData/kmmImgs";// 图片本地路径

    List res = new ArrayList<>();

    handlerPyresults = new HandlerPyresults();// 写个了工具类

    List pyFiles = handlerPyresults.getAllFile(pyFilePath);// 获取所有文件

    for(File file : pyFiles) {
        byte[] fig = handlerPyresults.file2Byte(file);// file类型转为byte[]类型
        String base64str = Base64.encodeBase64String(fig);// byte[]转为base64
        String img = "data:image/png;base64," + base64str;// 添加头,告诉前端这是个图片
        res.add(img);
    }
    return res;
}
/**
* file转byte[]
**/
public byte[] file2Byte(File file){
        if(file == null){
            return null;
        }
        FileInputStream fileInputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        try {
            fileInputStream = new FileInputStream(file);
            byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            int n;
            while ((n = fileInputStream.read(b))!=-1){
                byteArrayOutputStream.write(b,0,n);
            }
            return byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileInputStream.close();
                byteArrayOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

4.2 Java调用Python结果演示

我的python脚本主要是对数据集使用了KMM算法,是一种协变量偏移纠正的方法
通过散点图反映测试集和训练集之间的分布情况和差异,这里略…

Java-调用R语言和调用Python(前后端展示)

5. 总结

这个项目是我硕士期间导师丢给我的一个需求,这里说一下为什么要用Java调用R语言和Python。

  1. 首先我有一个伽马射线的二分类任务,通过R语言使用多个传统机器学习模型实现。
  2. 在此之前使用R语言实现了多维度数据集的数据预处理、特征选择等功能,并且出图方便,代码简单。
  3. Python则实现了数据集协变量偏移纠正的功能,最终得到的数据集用于丢进模型做分类。
  4. 这个平台通过调用R和Python,集成了数据集预处理、协变量偏移纠正的方法,并且可以通过多个图可视化看到分析结果。平台还实现了数据集上传、下载等功能…

  5. 主要是针对Java调用R语言以及调用Python作一个记录,实际上平台有许多细节都没有顾虑到,相当于一个学习笔记吧。

Original: https://www.cnblogs.com/torima/p/16312798.html
Author: Tttori
Title: Java-调用R语言和调用Python(前后端展示)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588947/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • redis启动报错(TCP backlog setting of 511/overcommit_memory is set to 0/THP)

    *WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/som…

    Java 2023年6月15日
    0144
  • security

    认证流程 导入依赖 org.springframework.boot spring-boot-starter-security 2.6.8 导入spring-boot-starte…

    Java 2023年6月13日
    066
  • 记批量生成二维码并返回压缩包

    记批量生成二维码并返回压缩包 添加依赖包—如果3.5.0用不了可以切换为3.4.1 com.google.zxing core 3.5.0 com.google.zxi…

    Java 2023年6月14日
    0136
  • Centos下安装Maven私服Nexus

    dockers安装Nexus,指定访问路径(默认为/;在使用Nginx做反向代理时,最好指定访问路径),并在容器外持久化数据,避免Nexus容器升级后数据丢失。 安装并启动 doc…

    Java 2023年6月5日
    0123
  • HTML详解

    一、初识HTML 初始基本标签代码解释 点击查看代码 <!–DOCTYPE:告诉浏览器我们要使用什么规范–> <!DOCTYPE html> <h…

    Java 2023年6月13日
    066
  • java网络编程

    网络编程 TCP 编程 使用tcp 之前先建立TCP连接,形成传输数据的通道,点对点的通信是可靠的。2,两个进程:客户端 服务端3,在连接中进行大量数据的传输4,传输完毕需要释放建…

    Java 2023年6月8日
    091
  • Digester解析xml原理

    Tomcat内部是使用Digester来解析xml文件的,将xml转化为java对象。 digester底层是基于SAX+事件驱动+栈的方式来搭建实现的,SAX主要用来解析xml,…

    Java 2023年6月9日
    0110
  • BindingException问题

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月5日
    095
  • 堆排序(java)

    目录 基础堆排序 一、概念及其介绍 二、适用说明 三、过程图示 四、Java 实例代码 优化堆排序 Java 实例代码 基础堆排序 一、概念及其介绍 堆排序(Heapsort)是指…

    Java 2023年6月5日
    086
  • Redis压缩列表

    此篇文章是主要介绍Redis在数据存储方面的其中一种方式,压缩列表。本文会介绍1. 压缩列表(ziplist)的使用场景 2.如何达到节约内存的效果?3.压缩列表的存储格式 4. …

    Java 2023年6月14日
    084
  • 启用Hyper-v后,重启后界面提示 无法完成功能配置,正在撤销更改

    安装docker后,提示需要启用hyper-v,在控制面板中勾选Hyper-v,然后重启,更新快完成就提示无法完成功能配置,正在撤销更改 解决方法 方法1 控制面板一个一个选 方法…

    Java 2023年6月16日
    0112
  • rocketmq工作原理

    1. 消息的生产过程 消息生产过程,经历如下过程: 1.向NameServer发出获取消息Topic的路由信息的请求2.nameServer返回该Topic的路由表以及Broker…

    Java 2023年5月30日
    091
  • Day01

    MarkDownd 标题 三级标题 字体 Hellow,World! Hellow,World! Hellow,World! Hellow,World! 引用 选择博客园,走向人生…

    Java 2023年6月13日
    087
  • 老徐和阿珍的故事:强引用、软引用、弱引用、虚引用,傻傻分不清楚

    人物背景:老徐,男,本名徐福贵,从事Java相关研发工作多年,职场老油条,摸鱼小能手,虽然岁数不大但长的比较着急,人称老徐。据说之前炒某币败光了所有家产,甚至现在还有欠债。阿珍,女…

    Java 2023年6月7日
    0100
  • 老生常谈系列之Aop–Aop的经典应用之Spring的事务实现分析(三)

    上一篇文章老生常谈系列之Aop–Aop的经典应用之Spring的事务实现分析(二)从三个问题导入,分析了Spring是如何开启事务的、Spring是如何为需要事务支持的…

    Java 2023年6月8日
    0106
  • JVM

    JVM 一、什么是JVM 定义 Java Virtual Machine,JAVA程序的运行环境(JAVA二进制字节码的运行环境) 好处 一次编写,到处运行 自动内存管理,垃圾回收…

    Java 2023年6月8日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球