Связывание 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.