Связывание R и Джулии?

Julia выглядит очень перспективно для быстрого и синтаксического вычисления (например, здесь), но я подозреваю, что это не будет где-то рядом с R в терминах общего рабочего процесса статистики еще некоторое время. Поэтому я хотел бы использовать его, где С++ в основном используется в R-программах: оптимизировать медленные части кода. Однако, прежде чем вкладывать время в изучение Джулии, мне любопытно, какие средства существуют для встраивания фрагментов Джулии в код R.

Итак:

  • Какие средства существуют для связи R и Julia?
  • Насколько надежны и продуманны они по шкале от нуля до Rcpp?

Я хочу называть Julia из R, так же как Rcpp позволяет вызывать С++ изнутри R прямо сейчас. Я не хочу называть R от Джулии. (Так что RCall.jl не работает)

Ответ 1

Пакет RJulia R теперь выглядит неплохо из R. R CMD check выполняется без предупреждений или ошибок (если julia установлена правильно).

На мой взгляд, самое большое TODO - заставить Джулию возвращать именованные списки, которые составляют действительно базовую гибкую общую структуру данных в R.

Обратите внимание, что Даг Бейтс предупредил меня о том, что RCall является двунаправленным интерфейсом от Джулии к R (т. Е. В другом направлении, кроме R к Джулии). Кроме того, Дуг рекомендовал использовать julia 0.4.0, а не текущие стабильные версии julia.

Ответ 2

Я тоже смотрел на Джулию с тех пор, как Дуг Бейтс послал мне хедз-ап в январе. Но, как и @gsk3, я измеряю это на "шкале Rcpp", поскольку я хотел бы передать богатые объекты R в Julia. И это, похоже, не поддерживается сейчас.

У Джулии хороший и простой интерфейс C. Таким образом, мы получаем что-то вроде .C(). Но, как недавно обсуждалось в r-devel, вы действительно не хотите .C(), в большинстве случаев вам скорее хочется .Call(), чтобы передавать фактические переменные SEXP, представляющие реальные объекты R. Поэтому сейчас я вижу мало возможностей для Джулии из R из-за этого ограничения.

Возможно, косвенный интерфейс, использующий tcp/ip для Rserve, может стать первым стартом до того, как Джулия созреет немного, и мы получим правильный С++-интерфейс. Или мы используем что-то, основанное на Rcpp, чтобы перейти от R к С++ до того, как мы введем промежуточный уровень [который кто-то должен будет писать], из которого мы передаем данные Julia, так же, как фактический R API предлагает только слой C. Незнайка.

И в конце дня может потребоваться некоторое терпение. Я начал смотреть на R примерно в 1996 или 1997 году, когда Фриц Лейш сделал первые анонсы в группе новостей comp.os.linux.announce. И у R были довольно ограниченные возможности (но полное обещание языка S, конечно же, мы знали, что у нас был победитель). И несколько лет спустя я был готов сделать его основным языком моделирования. В то время у CRAN было еще менее 100 пакетов...

Джулия вполне может туда попасть. Но на данный момент я подозреваю, что многие из нас получат работу в R, и у Джулии всего лишь несколько любопытных проблесков.

Ответ 3

План развития Julia, как я описал в этом ответе, позволяет разрешить компиляцию кода Julia в общие библиотеки, вызываемые с использованием C ABI. Как только это произойдет, будет легко вызвать код Julia из R, поскольку он должен вызвать код C/С++. Тем не менее, требуется большая работа, прежде чем это станет возможным.

Ответ 4

Быстрое обновление. Поскольку этот вопрос был задан, начался пакет Julia, который позволяет называть R-программы из Джулии.

Подробнее здесь: https://github.com/lgautier/Rif.jl

Ответ 5

Кто-нибудь видел этот проект?

https://github.com/armgong/RJulia

Довольно новый, но, похоже, делает именно то, что требуется!

Ответ 6

В последнее время я создаю пакет R под названием JuliaCall, который встраивает Julia в R. Пакет находится на CRAN.

https://cran.r-project.org/web/packages/JuliaCall/index.html

https://github.com/Non-Contradiction/JuliaCall

Использование пакета выглядит следующим образом:

library(JuliaCall)
julia <- julia_setup()
julia_command("a = sqrt(2)"); julia_eval("a")
julia_eval("sqrt(2)")
julia_call("sqrt", 2)
julia_eval("sqrt")(2)

Как вы можете видеть, вы можете отправлять командные строки и выполнять функции Julia очень легко.

И есть также некоторые пакеты R, упаковывающие пакеты Julia с использованием JuliaCall, например,

  • convexjlr для дисциплинированного выпуклого программирования в R с использованием Convex.jl, который также находится в CRAN.
  • ipoptjlr, R-интерфейс для OPTimizer точки интерьера (IPOPT) с использованием пакета Julia Ipopt.jl.

Добро пожаловать на любую обратную связь на JuliaCall!!

Ответ 7

Существует также пакет XRJulia из XR множество пакетов, нацеленных на e X, стремятся к R Джоном Чемберсом (одним из создателей R). Он использует немного другой подход (JSON) для передачи данных между Julia и R, а затем rJulia и аналогичными пакетами.

Ответ 8

Вы также можете проверить мою попытку: R-пакет JuliaConnector.

Его цель - импортировать функции из Julia непосредственно в R, чтобы их можно было использовать как R-функции в R-коде. Возвращаемые значения функций Julia переводятся в структуры данных R, которые можно использовать в R, а также передавать обратно в Julia. Это уже стабильно работает для базовых структур данных. Пакет пока только версии 0.1, но я активно его развиваю и планирую иметь готовый к выпуску продукт к концу 2019 года. Для дальнейшей интеграции Julia и R, также можно перезвонить от Julia в R путем передачи функций R в качестве функций обратного вызова.

Подобно XRJulia, JuliaConnectoR использует TCP, но он функционально ориентирован и использует оптимизированный пользовательский формат потоковой передачи вместо текстовых сообщений JSON, как XRJulia. Одним из преимуществ взаимодействия по TCP является стабильность по отношению к различным версиям Julia и R. Это гораздо сложнее поддерживать с помощью интеграции на уровне C-интерфейсов, как это делают RCall и JuliaCall.

Пакет работает с Julia ≥ 0,7 и широким спектром версий R.