从R中使用Java的入门程序-第1部分

6月23日,二千零一十八
通过

(本文首次发表于 乔佐夫的博客,并对 188bet appR博主

介绍

该底漆由两部分组成,其目的是为使用R.java开发的资源提供一种利用。它的结构更像是注意未来的自我”而不是适当的教育文章,不过,我还是希望有些读者会觉得它有用。它还将列出一组参考文献我觉得很有帮助,为此,我感谢各自的作者。

底漆分为两个柱:

  1. 在第一个例子中,我们讨论了使用rjava包创建对象,金宝搏网址调用方法并使用数组,我们研究了通过调用shell命令直接调用Java方法和从R调用Java代码的各种方法。
  2. 在第二个部分,我们将讨论在R脚本和包中创建和使用自定义.jar归档文件,从R中处理Java异常,并快速查看RJava提供的低级接口和高级接口之间的性能比较。
R<3 Java或者可能不是??

R<3 Java或者可能不是??

从R直接调用Java

从R直接调用Java资源可以使用R来实现。系统()函数,它调用指定的OS命令。我们可以使用已编译的Java类,或者也可以通过系统()从R呼叫。当然,对于任何现实世界的实际用途,我们可能会做Java编码,JavaIDE中的编译和JRIN,并提供R与Java.jar文件,然而,我发现有一个最简单的完整案例的小例子很有帮助,就这一点而言,以下内容就足够了。将预先准备好的罐子集成到一个R包中,这篇初级读物的第二部分将详细介绍。

让我们通过用两种方法编写一个非常愚蠢的虚拟类来证明这一点:

  • 主要的,那张照片世界你好!“+可选后缀,如果作为参数提供
  • 说再见方法,返回由“”构造的字符串我的名字叫“和getClass().getName())

这个helloworldsummy.java语言文件可以如下所示:

包dummyjavaclassjustforfun;public class helloworldsummy public string saymname()返回(“我的名字叫“+getClass().getName());公共静态void main(string[]args)string stringarg=”就这样。”;if(args.length>0)字符串arg=args[0];系统输出.println(“你好,世界。“+STRIGARG);}

通过bash命令编译和执行

现在我们已经准备好了虚拟课堂,我们可以将这些命令放在一起,通过一个shell执行命令来测试它们,或者对于RSTUDIO粉丝来说,我们可以通过rstudio的酷终端功能测试命令。第一,编译命令,可能看起来像下面这样,假设我们在正确的工作目录中:

$javac dummyjavaclassjustforfun/helloworlddummy.java

既然我们已经编译了类,我们可以执行主要的方法,提供或不提供参数:

$JAVA DimyJavaCasLasJavaFas/HeloRoLDLDIMUME $ Java DimyJavaCasLaskFask/HeloRoWord虚拟机我喜欢冬天“

如果我们需要编译和运行更多文件夹中的.jar罐子/,我们使用指定文件夹-CP(类路径):

$javac -CP罐子/ *DimyJavaCasaFaskFask/HeloRoLD.DimMy.java $JAVA -CPjars/*:编译/src“dummyjavaclassjustforfun/helloworldumy

从R编译和执行Java代码

既然我们已经测试了我们的命令,我们可以使用r通过系统功能。别忘了光盘如果需要,在单个系统调用中输入正确的目录:

系统(‘CD数据/;JavaDimyJavaCasaJavaFask/HeloRoLD.DimMy.java)

之后我们还可以执行主要的方法,以及主要的指定了一个参数的方法,就像我们在R区以外做的那样,再次使用光盘如果需要,输入正确的工作目录:

系统(‘CD数据/;JavaDimyJavaCasaJavaFask/HeloRoLDMIDMY’系统(CD数据/);JavaDimyJavaCasaFasFras/HeloRoWord虚拟机我也喜欢冬天。”’

RJava封装——一个R到Java接口

RJava封装为Java虚拟机提供了低级接口。它允许创建对象,调用方法并访问对象的字段。它还提供了将Java资源容易地包含到R包中的功能。

我们可以安装经典:

安装.packages(““爪哇”)

注意系统要求Java JDK 1.2或更高,JRI/RGEVER JDK 1.4或更高。装上包裹后,我们还需要初始化Java虚拟机(JVM):

附加rjava并初始化jvmlibrary(rjava).jinit()

如果附加包时出现问题,请使用图书馆,可以参考这个有用的stackoverflow线程.

用Java语言创建Java对象

现在我们将非常快速地介绍包的基本用途。这个JNEW函数用于创建新的Java对象。请注意参数在Java本机接口符号中需要完全限定的类名。

创建java.lang类StringShello<-.jnew(class=)的新对象Java/Lang/String,“世界你好!“)创建java.lang class integerione<-.jnew的新对象(class=”Java/Lang/整数,“1“)

通过rjava使用阵列

创建新阵列iarray<-.jarray(1l:2l).jevalarray(iarray)
α〔1〕1 2
使用2和lapply integer matrix int[2][2]imatrix<-.jarray(list(iarray,I阵列)contents.class=“[我])laplly(伊玛特里克斯,JavaLab阵)
[1][1]1 2[2][1]1 2
整数矩阵int[2][2]平方<-数组(1:4,DIM= C(2)2)方
α1、2〔α〕〔1〕;1 3[2,2 4
使用dispatch=true创建数组使用simple=true返回一个漂亮的r arraySquare<-.jarray(square,调度=真)。jevalarray(dsquare,简化=真)
α1、2〔α〕〔1〕;1 3[2,2 4
integer tesseract int[2][2][2][2]tesseract<-array(1l:16l,DIM= C(2)2,2,2)
第二,,1,(1)1、2〔α〕〔1〕;1 3[2,2 4,,2,(1)1、2〔α〕〔1〕;]5 7[2,6 8,,1,(2)1、2〔α〕〔1〕;]9 11[2,]10 12,,2,(2)1、2〔α〕〔1〕;]13 15[2,14 16
使用dispatch=true创建数组使用simply=true返回一个漂亮的r数组有趣的是,这看起来很奇怪。Jarray(Tesseract,Dispatch=true).jevalarray(dtesserct,简化=真)
第二,,1,(1)1、2〔α〕〔1〕;]10[2,0 0,,2,(1)1、2〔α〕〔1〕;0 0[2,0 8,,1,(2)1、2〔α〕〔1〕;9 0[2,0 0,,2,(2)1、2〔α〕〔1〕;0 0[2,0 16

使用RJava封装调用Java方法

RJava提供了两个级别的API:

  • 快,但不灵活的低级JNI-API的形式JCALL功能
  • 方便(以性能为代价)的高级反射API$操作员。

在实践中,从RJava包中有三种方法可以让我们调用Java方法,每个人都有积极的一面和消极的一面。

低层次的方式-jCar()

JCAL(OBJ)ReTrimsig =V”,方法,……)调用带有所提供参数的Java方法低级“方式。一些关于用法的重要说明,有关更多信息,请参阅.jcall上的r帮助:

  • 要求参数和返回类型完全匹配,不在反射表中执行任何查找
  • 传递方法定义中存在的类的子类需要使用JCAST
  • 传递空参数需要具有JNUL
  • 对应于原生Java类型的长度为1的向量被视为标量,使用J数组为了安全起见将向量作为数组传递
在对象低级的方式调用Java方法长度。ReTrimsig =我“,“长度“)
α〔1〕12
另外,我们必须小心数据类型:这很有效。jcall(Shello,ReTrimsig =C”,“查拉特,5L)
α〔1〕32
这不是。JCall(Shello,ReTrimsig =C”,“查拉特,5)
.jcall中的错误(Shello,ReTrimsig =C”,“查拉特,5):找不到带有签名(d)c的方法charat

高级方式-J-()

J类(方法,……)是用于访问Java的高级API,它比JNEWJCALL因为它必须使用反射来找到最合适的方法。

  • 要调用方法,这个方法参数必须作为长度为1的字符向量出现
  • 如果方法失踪,,J创建类名引用
在对象高级WAJ(Seelo)上调用Java方法长度“长度“)
α〔1〕12
# Also,高层不会以这种方式帮助这里(Shello,“查拉特,5L)
.jcall中的错误(o,“我“,“英特沃斯):找不到签名为()的方法IntValue
杰罗,“查拉特,5)
.jcall中出错(“RjavaToOL,“ljava/lang/对象;“,“方法论,cl,: java.lang.NoSuchMethodException: No suitable method for the given parameters

便利的高级方式-$

J函数,这个$算子约瑟夫夫Java对象引用提供了对对象属性的方便访问,并通过实现完成生成器的相关方法来调用Java方法。

  • $返回属性值或调用方法,取决于哪个名字先匹配
  • $<为对应的Java属性赋值
通过$operatorShello$length()进行
α〔1〕12
但这些仍然不适用于$charat(5L)
.jcall中的错误(o,“我“,“英特沃斯):找不到签名为()的方法IntValue
Shello$Charat(5)
.jcall中出错(“RjavaToOL,“ljava/lang/对象;“,“方法论,cl,: java.lang.NoSuchMethodException: No suitable method for the given parameters

检查方法和领域

名字返回与对象关联的所有字段和方法。方法名称后接()取决于数量:

与Shello.Dollarnames(Shello)关联的所有字段和方法的向量
〔1〕大小写不敏感“等于(“〔3〕托斯特林()“HASCODE()〔5〕比较()“比较()〔7〕索引()“索引()〔9〕索引()“索引()〔11〕()“()〔13〕()“()〔15〕()“()〔17〕()“()〔19〕()“长度()〔21〕iSimple()“查拉特〔23〕代码点“代码点之前(“〔25〕代码点计数(““按码位偏移(“〔27〕盖查尔斯“GETBYTESE()〔29〕获取字节(““获取字节(“〔31〕获取字节(““联系规则〔33〕联系规则“相等符号或大小写(“〔35〕CompareToIgnoreCase(““区域比赛〔37〕区域比赛“SaltStand(“〔39〕SaltStand(““与()〔41〕拉斯特指数“拉斯特指数〔43〕拉斯特指数“拉斯特指数〔45〕子串(“子串”)“子串(“子串”)〔47〕子序列(““康塔特〔49〕替换(”“替换(”〔51〕火柴(““包含(“〔53〕首先替换(““替换所有(“〔55〕分裂(““分裂(“〔57〕加入(““加入(“〔59〕托箱“TooWrCase[()〔61〕TouPulaseCe()“小人物〔63〕三()“ToCARARRAY()〔65〕格式(““格式(“〔67〕()“()〔69〕内部()“等待(“〔71〕等待(““WAIT()〔73〕GETCHILL()“()〔75〕()“()〔77〕代码点()“

JNI符号签名

爪哇型 签名
布尔 Z
字节
烧焦 C
短的 S
int
长的 J
浮动 f
双重的 D
[类型] [类型]
方法类型 (arg类型)ret类型
完全合格等级 合格等级;;

在上表的完全限定类行中,请注意

  • L前缀
  • ;;后缀

例如

  • Java方法:长f(int n)字符串S,INT[ARR ];;
  • 具有类型签名:(iljava/lang/string;[我] J

工具书类

  1. rjava基本崩溃课程–在Rforge的Rjava站点,向下滚动到文档部分
  2. JNI类型签名–符合Oracle JNI规范
  3. RJava文档论克兰
  4. 从R调用Java代码由教授达伦·威尔金森
  5. Java(JNI)与本机代码之间的类型映射
  6. 修复加载rjava的问题

你觉得这篇文章有用还是有趣?通过分享帮助他人找到它

留下评论作者,请关注他们博客上的链接和评论: 乔佐夫的博客.

188bet appR博客提供 每日电子邮件更新金宝搏网址 R新闻与 教程关于以下主题: 数据科学,, 大数据,, r作业,可视化(可视化) GGPROTT2,, 箱形图,, 地图,, 动画)程序设计(程序) 演播室,, 斯威夫特,, 乳胶,, SQL,, 日食,, 吉特,, 哈多普,, 刮网)统计 回归,, 主成分分析,, 时间序列,, 交易还有更多…



如果你走这么远,为什么不 订阅更新 从站点?选择您的口味: 电子邮件,, 推特,, 1188bet app,或 脸谱网

注释已关闭。

搜索R-Blo188bet appggers


赞助商

千万不要错过更新!!
订阅R-Bloggers188bet app接收
最新R帖子的电子邮件。
(您将不再看到此消息。)

单击此处关闭(此弹出窗口将不再出现)