С чего начать с rJava?

Я не программист на Java. Я программирую R и С++. У меня есть код Java, который я хочу включить в пакет R. Основы программы:

  • Чтение данных со стандартного ввода.
  • Запустите цепочку MCMC.
  • вывод в файл.

Я хочу преобразовать это в R, где я могу запустить программу из R. Я знаком с пакетом Rcpp и привык к некоторым из его удобств. С чего начать с пакета rJava, чтобы научиться использовать этот код.

В частности, у меня есть следующие вопросы.

  • Как передать данные в java из R, например. числовой вектор, коэффициент и т.д.
  • Как запустить методы класса?
  • Как включить Java-код в пакет?

Документация rJava не очень полезна. У кого-нибудь есть учебник по этому поводу?

Ответ 1

Там есть "простой" способ сделать это и несколько более сложный способ сделать это. Я простой человек, поэтому я склоняюсь к простому решению:

myCommand <- paste("/path/to/java", argument1, argument2, sep=" ")
system(shQuote(myCommand))

Затем читать в выходном файле, используя любую функцию R, имеет смысл.

Несколько сложнее решение - отредактировать ваш Java-код, чтобы он не читал из stdin, а передавал вектор или другой объект Java. Я не могу обобщить, как изменить свой Java-код, но если в конечном итоге функции Java необходимо загрузить с помощью вектора, вы сделаете это примерно так:

.jinit()
v <- .jnew("java/util/Vector")
rVector <- as.character(1:10)
addToV <- function( item ){
  v$add( item )
}
sapply(rVector, addToV)

Я всегда сталкиваюсь с типами в rJava, чтобы быть значительной болью, как вы можете видеть выше.

Один совет, который сэкономит вам много времени, таков: когда у вас есть Java-объект, созданный в rJava, вы можете найти его методы, набрав имя, знак доллара, а затем нажмите вкладку. Поэтому, используя созданный выше объект v типа "v $", вы должны получить следующее:

1> v$
v$add(                 v$hashCode()           v$contains(            v$size()               v$elementAt(           v$capacity()           v$containsAll(         v$firstElement()       v$removeElement(       v$iterator()           v$wait()
v$get(                 v$clone()              v$isEmpty()            v$toArray()            v$remove(              v$ensureCapacity(      v$removeAll(           v$insertElementAt(     v$removeElementAt(     v$listIterator()       v$getClass()
v$equals(              v$indexOf(             v$lastIndexOf(         v$toArray(             v$elements()           v$trimToSize()         v$retainAll(           v$lastElement()        v$setElementAt(        v$listIterator(        v$notify()
v$toString()           v$clear()              v$addAll(              v$addElement(          v$set(                 v$subList(             v$copyInto(            v$removeAllElements()  v$setSize(             v$wait(                v$notifyAll()
1> v$

Удачи, и будьте уверены, и кричите, если у вас есть определенные коряги.

Ответ 2

Это описано в документе разработки плагина Deducer. Хотя он ориентирован на пакеты, расширяющие Deducer, некоторые разделы являются общими.

Запуск java-методов в R: http://www.deducer.org/pmwiki/pmwiki.php?n=Main.Development#wwjoir

Приведение объектов R в java и создание пакета с Java-кодом: http://www.deducer.org/pmwiki/pmwiki.php?n=Main.Development#suaptijc

Полное раскрытие: Deducer - это мой проект.