我在做什么?
我正在用Java编写一个数据分析程序,该程序依赖于R的arulesViz
库来挖掘关联规则。
我想要什么?
我的目的是将规则存储在Java中的String变量中,以便以后进行处理。
它如何工作?
该代码分别使用String.format
和eval
Java和RJava指令的组合来工作,其行为概括为:
arules
库将最近创建的数据框格式化为事务列表。apriori
算法。write
方法将它们写入标准输出,捕获输出并将其存储在变量中。我们已经将关联规则转换为字符串变量。代码如下:
// Step 1
Rutils.rengine.eval("dataFrame <- data.frame(as.factor(c(\"Red\", \"Blue\", \"Yellow\", \"Blue\", \"Yellow\")), as.factor(c(\"Big\", \"Small\", \"Small\", \"Big\", \"Tiny\")), as.factor(c(\"Heavy\", \"Light\", \"Light\", \"Heavy\", \"Heavy\")))");
//Step 2
Rutils.rengine.eval("transList <- as(dataFrame, 'transactions')");
//Step 3
Rutils.rengine.eval(String.format("info <- apriori(transList, parameter = list(supp = %f, conf = %f, maxlen = 2))", supportThreshold, confidenceThreshold));
// Step 4
Rutils.rengine.eval("orderedRules <- sort(info, by = c('count', 'lift'), order = FALSE)");
// Step 5
REXP res = Rutils.rengine.eval("rulesAsString <- paste(capture.output(write(orderedRules, file = stdout(), sep = ',', quote = TRUE, row.names = FALSE, col.names = FALSE)), collapse='\n')");
// 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运行配置: