Java的R代码可在Linux上运行,但不能在Windows中运行

时间:2019-07-06 14:10:09

标签: java r linux windows jri

我在做什么?

我正在用Java编写一个数据分析程序,该程序依赖于R的arulesViz库来挖掘关联规则。

我想要什么?

我的目的是将规则存储在Java中的String变量中,以便以后进行处理。

它如何工作?

该代码分别使用String.formateval Java和RJava指令的组合来工作,其行为概括为:

  1. 给出格式正确的Java数据结构,在R中创建一个数据框。
  2. 使用arules库将最近创建的数据框格式化为事务列表。
  3. 使用事务列表和一些必要的值作为参数运行apriori算法。
  4. 对生成的关联规则进行重新排序。
  5. 鉴于关联规则无法打印,请使用R的write方法将它们写入标准输出,捕获输出并将其存储在变量中。我们已经将关联规则转换为字符串变量。
  6. 我们返回字符串。

代码如下:

// 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运行配置:

Linux run configuration

Windows运行配置:

Windows run configuration

0 个答案:

没有答案