我在做什么?
我正在用Java编写一个数据分析程序,该程序依赖R的arulesViz库来挖掘关联规则。
我想要什么?
我的目的是将规则存储在Java中的String变量中,以便以后进行处理。
它是如何工作的?
该代码分别使用String.format和eval Java和RJava指令组合工作,其行为概括为:
给定格式正确的Java数据结构,在R中创建一个数据帧。
使用arules库将最近创建的数据框格式化为事务列表。
使用事务列表和一些必要的值作为参数运行apriori算法。
重新排序生成的关联规则。
如果无法打印关联规则,则使用R的write方法将它们写入标准输出,捕获输出并将其存储在变量中。 我们已经将关联规则转换为字符串变量。
我们返回字符串。
代码如下:
// Step 1
Rutils.rengine.eval("dataFrame
//Step 2
Rutils.rengine.eval("transList
//Step 3
Rutils.rengine.eval(String.format("info
// Step 4
Rutils.rengine.eval("orderedRules
// Step 5
REXP res = Rutils.rengine.eval("rulesAsString
// Step 6
return res.asString().replaceAll("'", "");
怎么了?
在Linux上运行代码将可以完美地工作,但是当我尝试在Windows中运行它时,出现以下错误,该错误涉及return行:
Exception in thread "main" java.lang.NullPointerException
每当R代码生成空结果并将其传递给Java时,这都是我常见的错误。 无法在Java中对R代码进行语法检查,因此,每当输入错误时,都会出现此错误消息。
但是,当我在Windows中的R命令行中的括号中运行R代码时,它可以正常工作,因此语法和数据流都可以。
技术信息
在Linux中,我将R与OpenJDK 10一起使用。
在Windows中,我当前正在使用Oracle的最新JDK版本,但是尝试在Windows的OpenJDK 12中运行该程序不能解决任何问题。
一切都是64位。
两种操作系统中使用的IDE是IntelliJ IDEA 2019。
屏幕截图
Linux运行配置:
Windows运行配置: