R-код в Java, работающий в Linux, но не в Windows - PullRequest
1 голос
/ 06 июля 2019

Что я делаю?

Я пишу программу анализа данных на Java, которая использует библиотеку R´s arulesViz для правил ассоциации.

Что я хочу?

Моя цель - сохранить правила в строковой переменной в Java, чтобы я мог обработать их позже.

Как это работает?

Код работает с использованием комбинации String.format и eval инструкций Java и RJava соответственно, и его поведение обобщено как:

  1. При правильно отформатированных структурах данных Java создает фрейм данных в R.
  2. Форматирует недавно созданный фрейм данных в список транзакций с использованием библиотеки arules.
  3. Запускает алгоритм apriori со списком транзакций и некоторыми необходимыми значениями, передаваемыми в качестве параметра.
  4. Изменение порядка созданных правил ассоциации.
  5. Учитывая, что правила связывания не могут быть напечатаны, они записываются в стандартный вывод с помощью метода R´s 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. Нет способа синтаксической проверки кода R внутри Java, поэтому всякий раз, когда он ошибается, появляется это сообщение об ошибке.

Однако, когда я запускаю код R в скобках в командной строке R в Windows, он работает безупречно, поэтому и синтаксис, и поток данных в порядке.

Техническая информация

  • В Linux я использую R с OpenJDK 10.

  • В Windows в настоящее время я использую последний выпуск Oracle JDK, но попытка запустить программу с OpenJDK 12 для Windows ничего не решает.

  • Все 64 бита.

  • В обеих операционных системах используется IDE IntelliJ IDEA 2019.

Скриншоты

Настройка запуска Linux:

Linux run configuration

Конфигурация запуска Windows:

Windows run configuration

...