• R语言- 实验报告



    一、 实训内容

    1. 利用R语言对Java项目程序进行调用,本实验包括利用R语言对java的.java文件进行编译和执行输出。
    2. 在Java中调用R语言程序。本实验通过eclipse编写Java程序的方式,调用R语言的脚本文件进行传值运算,并将执行后的结果返回给Java程序。

    二、 实验课题目标

    1. 要求能在R x64 3.6.1程序中进行简单的工作空间切换功能,以及掌握基本的shell.exec()和system()函数的应用。
    2. 掌握在R语言中进行包的下载和加载的方法,以及启动Rserve服务的方法。
    3. 掌握R语言与Java相互调用的基本原理和实现方法。

    三、 实验平台

      1、  系统:  Windows 10

             Intel(R) Core(TM)i7-7500U CPU @ 2.70GHz 2.90 GHz

        RAM 8.00GB

      2、工具:

             R x64 3.6.1  

        notepad.exe

        eclipse

        word 2016

    四、 实施步骤

    (1)、R语言调用Java项目程序

      1、  切换R语言的工作空间。

        首先在C:目录下,新建文件夹为workspace,再打开R x64 3.6.1程序,输入命令:getwd()  ,获取当前R语言程序的工作空间。输入如命令:setwd("C:/workspace")  ,将workspace作为R语言的工作目录,再加以验证是否切换成功。

    图4-1 切换工作空间


      2、  编写Java程序。

        在R x64 3.6.1程序中,输入命令:shell.exec("notepad")  ,打开记事本,编写相应的Java类文件,并保存到C: workspace目录下,命名为demo.java。

    图4-2  R语言打开notepad

    图4-3 Java代码示例


      3、  使用R语言编译Java源文件。

        首先,这里以demo.java文件,虽然只有一个.java格式的文件,但是也可以将其理解为一个简单的Java项目。在R x64 3.6.1程序中,输入命令:system("javac demo.java")  ,编译C: workspace目录下的demo.java文件。

    图4-4 编译Java文件成功


            当在返回的结果中看到[1] 0  ,则表示已经成功进行了编译。如图4-5所示,在C: workspace目录下,已经成功生成了demo.class字节文件,也再次验证了编译过程中没有错误。

    图4-5 编译结果生成文件


      4、  使用R语言运行已经编译的demo.class文件。在R x64 3.6.1程序中,输入命令:system("java demo")  ,执行刚编译好的demo.class字节文件。

    图4-6 执行成功


      很明显,在返回的结果中显示:“利用R语言成功调用Java程序!  [1] 0”的字样,这表示R语言成功调用了经过编译的Java项目程序。这里虽然是以简单的单个.java文件做实验,但即使Java项目文件再多,此方法都可以使用。

    (2)、Java中调用让语言程序

      1、安装Rserve包。在R x64 3.6.1程序中,输入命令:install.packages("Rserve") ,下载‘Rserve’程序包。在弹出的mirrors选项中,选择上海的服务器即可。

    图4-7 Rserve下载成功


      2、加载Rserve包。输入命令:library(Rserve)  ,加载Rserve程序包。

      3、启动服务。输入命令:Rserve()   ,开始启动Rserve服务。

    图4-8 Rserve服务开启成功


      4、编写调用R语言的Java程序。打开eclipse,新建项目为demo。同时,在demo项目工程名称上右击,选择“Build Path”-“Configure Build Path..”。在Libraries

        选项卡中,单击Add External JARs.. ,加载2、3步骤中下载的REngine.jarRserve.jar文件

    图4-9成功加载Rserve包


      5、  编写demo类文件。具体示例代码如下:

    package demo;
    
    import org.rosuda.REngine.Rserve.RConnection;
    
    import org.rosuda.REngine.Rserve.RserveException;
    
    import org.rosuda.REngine.REXPMismatchException;;
    
    public class demo {
    
            public static void main(String[] args) throws REXPMismatchException {
    
                     RConnection connection = null;
    
                     System.out.println("平均值");
    
                     try {
    
                             connection = new RConnection();
    
                             String vetor = "c(1,2,3,4)";
    
                             connection.eval("meanVal<-mean(" + vetor +")");
    
                             double mean = connection.eval("meanVal").asDouble();
    
                             System.out.println("the mean of given vector is=" + mean);
    
                     } catch (RserveException e) {
    
                             e.printStackTrace();
    
                     }
    
                     System.out.println("执行脚本");
    
                     try {
    
                             connection.eval("source('c:/ workspace/myAdd.r')");
    
                             int num1 = 20;
    
                             int num2 = 10;
    
                             int sum = connection.eval("myAdd(" + num1 + "," + num2 + ")").asInteger();
    
                             System.out.println("the sum=" + sum);
    
                     } catch (RserveException e) {
    
                             System.out.println(e);
    
                             e.printStackTrace();
    
                     }
    
                     connection.close();
    
            }
    
    }



      6、  在c:workspace目录下新建myAdd.r脚本,脚本内容如图所示:

    图4-10 myAdd.r脚本


      7、  在eclipse中运行该工程的主类文件,运行结果如图4-11所示:

    图4-11 执行成功


             明显,在返回的结果中,有以下信息:“the mean of given vector is=2.5

        执行脚本 the sum=30 ”,这正是Java程序调用R语言执行后,返回的结果。

    五、 实验成果

    (1)、R语言调用Java项目程序

         在实验步骤中,利用R对编译的demo.class字节文件进行执行时,成功返回如图5-1所示的内容,即“利用R语言成功调用Java程序!  [1] 0”,表明利用R语言成功运行了Java项目程序。同时,隐含性地表明R语言可以调用Java语言,对.java文件进行编译和执行。

    图5-1  R语言成功调用Java


    (2)、Java中调用R语言程序

        当在eclipse中运行调用R脚本的主类时,在执行反馈信息中,返回了:“the mean of given vector is=2.5 执行脚本 the sum=30 ”。这计算结果,需通过R语言进行,也就是说Java也成功调用了R语言,即调用R语言脚本进行运算。如图5-2所示:

    图5-2 Java调用R语言程序成功


    六、 实训总结

    本实验的经验收获和总结,可分点总结如下:

    1. 在利用Java调用R语言脚本时,需要加载REngine.jar和Rserve.jar两个jar包。而这两个jar包来源于,在中R x64 3.6.1使用install.packages("Rserve") 的方式进行下载Rserve。
    2. 在服务端计算机安装R之后可以直接使用install.packages(“Rserve”)进行安装。需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器就可以供客户端调用。
    3. 在实现R语言调用java的过程中,也可以使用rjava包,其是一个R语言和Java语言的通信接口,通过底层JNI实现调用,允许R直接调用java对象的方法。而本实验,利用简单的函数system()来实现在R语言直接调用Java程序。
    4. 在R语言调用java的时候,也可以进行传值类型的调用。即:Main函数参数String[] args,它是一个字符串数组,用来接收从命令行输入的参数。

    参数之间用空格隔开,java解释器会自动处理,把用空格隔开的每一个参数通过args数组传递给main方法。参数下标从0开始,args[0]就代表1第一个参数。当然输入参数之间可以有多个空格,中间的多个空格会被忽略掉。

  • 相关阅读:
    Path Sum
    Linked List Cycle II
    Linked List Cycle
    Single Number i and ii
    Binary Tree Preorder Traversal and Binary Tree Postorder Traversal
    Max Points on a Line
    Evaluate Reverse Polish Notation
    【leetcode】98 验证二叉搜索树
    【vivo2020春招】 02 数位之积
    【vivo2020春招】03 vivo智能手机产能
  • 原文地址:https://www.cnblogs.com/Raodi/p/11932875.html
Copyright © 2020-2023  润新知