Что я делаю?
Я пишу программу анализа данных на Java, которая использует библиотеку R´s arulesViz
для правил ассоциации.
Что я хочу?
Моя цель - сохранить правила в строковой переменной в Java, чтобы я мог обработать их позже.
Как это работает?
Код работает с использованием комбинации String.format
и eval
инструкций Java и RJava соответственно, и его поведение обобщено как:
- При правильно отформатированных структурах данных Java создает фрейм данных в R.
- Форматирует недавно созданный фрейм данных в список транзакций с использованием библиотеки
arules
.
- Запускает алгоритм
apriori
со списком транзакций и некоторыми необходимыми значениями, передаваемыми в качестве параметра.
- Изменение порядка созданных правил ассоциации.
- Учитывая, что правила связывания не могут быть напечатаны, они записываются в стандартный вывод с помощью метода R´s
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. Нет способа синтаксической проверки кода R внутри Java, поэтому всякий раз, когда он ошибается, появляется это сообщение об ошибке.
Однако, когда я запускаю код R в скобках в командной строке R в Windows, он работает безупречно, поэтому и синтаксис, и поток данных в порядке.
Техническая информация
В Linux я использую R с OpenJDK 10.
В Windows в настоящее время я использую последний выпуск Oracle JDK, но попытка запустить программу с OpenJDK 12 для Windows ничего не решает.
Все 64 бита.
В обеих операционных системах используется IDE IntelliJ IDEA 2019.
Скриншоты
Настройка запуска Linux:
Конфигурация запуска Windows: