连接 R 和 Julia?

Posted

技术标签:

【中文标题】连接 R 和 Julia?【英文标题】:Linking R and Julia? 【发布时间】:2012-04-15 11:35:18 【问题描述】:

Julia 在快速和语法健全的计算方面看起来非常有前途(例如here),但我怀疑在一段时间内就整体统计工作流程而言它不会接近 R。所以我想在 C++ 主要用于 R 程序的地方使用它:优化代码的慢部分。不过,在我花时间学习 Julia 之前,我很好奇有哪些工具可以将 Julia sn-ps 嵌入到 R 代码中。

所以:

有哪些设施可以 在从零到 Rcpp 的范围内,它们的稳健性和经过深思熟虑的程度如何?

我想从 R 中调用 Julia,就像 Rcpp 现在允许从 R 中调用 C++一样。我不想给 Julia 打电话。 (所以 RCall.jl 不起作用)

【问题讨论】:

我的猜测是你会成为一个非常早期的采用者并受到这些惩罚。我很乐意犯错 - 我也很乐意让你完成这项工作并为我们的中等采用者铺平道路...... 他们在性能基准测试中使用的函数似乎是使用 R 的一种非常不寻常的方式:github.com/JuliaLang/julia/blob/master/test/perf/perf.R。这几乎就像将柴油放入法拉利...... 我有一个 Julia-to-R 桥大致工作 (github.com/lgautier/Rif.jl)。反过来取决于 Julia 端的工作仍在进行中。 @lgautier 我真诚地希望你能设法恢复你的工作。见鬼,如果有一个 kickstarter 页面来支持这一点,我肯定会在那里。 @James 链接已损坏 - 新链接似乎是 github.com/JuliaLang/julia/blob/master/test/perf/micro/perf.R 【参考方案1】:

我也是have been looking at Julia ever since Doug Bates sent me a heads-up in January。但就像@gsk3 一样,我用“Rcpp 量表”来衡量它,因为我想将丰富的 R 对象传递给 Julia。现在似乎根本不支持。

Julia 有一个漂亮而简单的 C 接口。这让我们得到了像.C() 这样的东西。但正如最近在 r-devel 上所讨论的,你真的不想要 .C(),在大多数情况下你宁愿想要 .Call() 以便传递代表真实 R 对象的实际 SEXP 变量。因此,由于这个限制,现在我认为 R 中的 Julia 的应用范围很小。

也许在 Julia 稍微成熟之前,使用 tcp/ip 到 Rserve 的间接接口可能是第一个开始,我们得到一个合适的 C++ 接口。或者我们使用基于 Rcpp 的东西从 R 到 C++,然后我们进入一个中间层[有人必须编写],从中我们将数据馈送到 Julia,就像实际的 R API 只提供一个 C 层一样。我不知道。

最终,可能需要一些耐心。大约在 1996 年或 1997 年,当 Fritz Leisch 在 comp.os.linux.announce 新闻组上发布第一个公告时,我开始关注 R。那时 R 的设施相当有限(但是 S 语言的全部承诺,当然,我们知道我们有一个赢家)。几年后,我准备将其作为我的主要建模语言。当时 CRAN 的包裹还不到 100 个……

朱莉娅很可能会到达那里。但就目前而言,我怀疑我们中的许多人会在 R 中完成工作,并且对 Julia 有一些好奇的一瞥。

【讨论】:

据我所知,julia 没有计划让静态编译器允许嵌入到 C++ 中,我们可能需要等待一段时间【参考方案2】:

RJulia R 包现在从 R 看起来相当不错。R CMD check 运行时没有警告或错误(如果正确安装了 julia)。

在我看来,最大的 TODO 是让 Julia 返回命名列表,这些列表构成了 R 中真正基本的灵活通用数据结构。

请注意,Doug Bates 提醒我 RCall 是从 Julia 到 R 的双向接口(即,除了 R 到 Julia 的另一个方向)。此外,Doug 建议针对 julia 0.4.0 而不是当前的稳定版 julia。

自上述编写以来,又出现了几个接口: 现在(2021-04),我们有 R 包

JuliaCall (~2017) 将 Julia 嵌入到 R 中,并得到积极维护 available from CRAN。 JuliaConnectoR (~2019),也可从 CRAN 获得,其目标更高,例如,直接将 julia 对象导入 R

【讨论】:

目前接受的答案已经过时。目前从 R 调用 Julia 的最佳方式是 JuliaCall(参见下面的 Consistency 的答案),顺便说一句,这取决于 RCall.jl(Julia 包从 Julia 调用 R)。 谢谢@Levasco。你是对的“到目前为止”。我承认事情正在发生变化,5.2 年前的“最佳”现在不再是。 现在是 Julia 1.6。朱莉娅有DictOrderedDictDataFrames、命名VectorsTuplesNamedArrays,我可能忘记了一些。 确实,是时候更新了。谢谢@PatrickT 非常感谢马丁! :-)【参考方案3】:

正如我在this answer 中所描述的,Julia 开发计划是允许将 Julia 代码编译到共享库中,可以使用 C ABI 调用。一旦发生这种情况,从 R 调用 Julia 代码就像调用 C/C++ 代码一样容易。然而,在这成为可能之前,还需要做大量的工作。

【讨论】:

这听起来很有希望。我(我认为其他人)认为 Julia 是 Matlab 当前使用方式的一个很好的替代品——对于计算量大的结果,仍然需要比 C 及其同类提供更多的数学直觉。为此,R 和 Julia 可能是一个了不起的补充。即使 Julia 取代了 R(坦率地说,我会接受),至少要十年后 Julia 中的统计库才会如此丰富,因此同时 R 和 Julia 之间的接口功能可以帮助打开-源统计计算蓬勃发展。 自从您写了这篇文章后,这种情况有变化吗? (附:我 Julia,感谢您的工作!)【参考方案4】:

快速更新。自从提出这个问题以来,就有了一个 Julia 包的开始,它允许人们从 Julia 中调用 R 程序。

更多:https://github.com/lgautier/Rif.jl

【讨论】:

谢谢,但请参阅上面 lgautier 本人的 cmets。这是相反的方向。我想从 R 中给 Julia 打电话。 +1 因为在 Julia 这样狭窄的话题中,每条信息都非常有用 正如@AriB.Friedman 所说,这不是新信息——我们都想从 R 中调用 Julia,而不是反过来。【参考方案5】:

我最近创建了一个名为 JuliaCall 的 R 包,它将 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 包使用 JuliaCall 包装 Julia 包,例如,

convexjlr 用于 R 中使用 Convex.jl 的有纪律的凸编程,它也在 CRAN 上。 ipoptjlr,内部点优化器 (IPOPT) 的 R 接口,使用 Julia 包 Ipopt.jl

欢迎对JuliaCall提供任何反馈!!

【讨论】:

您能帮帮我吗?我如何使用JuliaCall 退出 Julia?我在 R 上运行代码,并在管道的一部分中计算 Julia 上的混合模型(使用 JuliaCall)。所以,我想在混合模型执行完成后杀死 julia 进程。可能吗?我尝试julia_command("exit()"),但它也杀死了 R 会话:( @red_quark 一般不需要杀死 julia 进程。有什么具体原因吗?如果是这样,也许您可​​以在 *** 或 github 上发布另一个问题。 这是向操作系统释放 RAM(分配给 Julia 进程)所必需的。我在 *** 上已经有这样的问题了:***.com/questions/61000913/… @red_quark 要释放内存,可以在 julia 中释放内存,而不是关闭 julia。比如注意全局变量,尽量使用函数。我最近在 GitHub 上回答了一个类似的问题。也许它对你有帮助。 github.com/Non-Contradiction/JuliaCall/issues/139>【参考方案6】:

有人看过这个项目吗?

https://github.com/armgong/RJulia

相当新,但似乎完全符合要求!

【讨论】:

感谢您的提示。确实,如果可行,这将是解决方案。我尝试安装(使用最新的 R 3.1.2 补丁)和 julia(0.4.0-dev .. 于 2014 年 12 月 30 日更新为 ubuntu 包)。然后编译失败,我打开了 github 问题 github.com/armgong/RJulia/issues/10 让我们希望我们能更进一步......很快 有什么进展吗?我从他们的 github repo 收到了非常活跃的开发通知,所以我想这些问题正在被解决...... 确实!没有在这里跟进——但是在上面的问题页面上:主要问题都被删除了。我自愿让软件包更接近可发布(对 CRAN),即通过添加有用的帮助页面。但不幸的是,我在其他忙碌的事情上太忙了,所以现在必须等待(对我来说)。【参考方案7】:

还有来自XR 系列的XRJulia package 包旨在eX倾向于R John Chambers(R 的创建者之一)。它使用稍微不同的方法 (JSON) 在 Julia 和 R 之间传输数据,然后在 rJulia 和类似包之间传输。

【讨论】:

【参考方案8】:

您可能还想看看我的尝试:JuliaConnectoR R-package。该软件包可从GitHub 和CRAN 获得。

它的目标是直接在 R 中从 Julia 导入函数,这样它们就可以像 R 代码中的 R 函数一样使用。 Julia 函数的返回值被转换为 R 数据结构,可以在 R 中使用,也可以传回给 Julia。 为了进一步集成 Julia 和 R,还可以通过将 R 函数作为回调函数传递来从 Julia 回调到 R。

与 XRJulia 类似,JuliaConnectoR 依赖于 TCP,但它以功能为导向,并使用优化的自定义流格式,而不是 XRJulia 所做的基于文本的 JSON 消息。 通过 TCP 进行通信的一个优势是相对于不同版本的 Julia 和 R 的稳定性。这在 RCall 和 JuliaCall 等 C 接口级别的集成中更难维护。

该软件包适用于 Julia ≥ 1.0 和各种 R 版本。

【讨论】:

以上是关于连接 R 和 Julia?的主要内容,如果未能解决你的问题,请参考以下文章

Julia TCP 服务器和连接

行绑定Julia数据帧

在 Julia 中加入 DataFrame

R和Julia内核在Jupyter笔记本中不可用

Julia - 短路求值

使用 julia 连接到 CPLEX 远程 API