63

我想从 Python 程序中访问 R。我知道 Rpy2、pyrserve 和 PypeR。

这三个选项的优点或缺点是什么?

4

4 回答 4

40

我比其他人更了解这三个中的一个,但是按照问题中给出的顺序:

rpy2:

  • Python 和 R 之间的 C 级接口(R 作为嵌入式进程运行)
  • 暴露给 Python 的 R 对象无需复制数据
  • 相反,Python 的 numpy 数组可以在不复制的情况下暴露给 R
  • 低级接口(接近 R C-API)和高级接口(为了方便)
  • 可以对向量和数组进行就地修改
  • R回调函数可以用Python实现
  • 可能有带有 Python 标签的匿名 R 对象
  • 可以进行 Python 酸洗
  • 使用控制台完全自定义 R 的行为(因此可以实现完整的 R GUI)
  • 支持有限的 MSWindows

焦糖:

  • 本机 Python 代码(将/应该/可能与 CPython、Jython、IronPython 一起使用)
  • 使用 R 的 Rserve
  • 与远程计算和 RServe 相关的优点和不便

派珀:

  • 本机 Python 代码(将/应该/可能与 CPython、Jython、IronPython 一起使用)
  • 使用管道让 Python 与 R 通信(有与之相关的优点和不便)

编辑: Windows 对 rpy2 的支持

于 2011-04-13T01:19:17.617 回答
17

来自PypeR 统计软件杂志上的论文

RPy 提供了一种从 Python 访问 R 的简单有效的方法。对于 Python 和 R 之间的频繁交互操作,它健壮且非常方便。该包允许 Python 程序将基本数据类型的 Python 对象传递给 R 函数,并以 Python 对象的形式返回结果。对于 Python 和 R 频繁交互的情况,这些特性使其成为一个有吸引力的解决方案。但是,此软件包仍然存在如下所列的限制。
表现:
对于大型数据集或计算密集型任务,RPy 可能表现不佳。生成 R 数据的 Python 副本不可避免地会消耗大量时间和内存,因为在每一轮对话中,RPy 都会将 R 表达式的返回值转换为基本类型的 Python 对象或 NumPy 数组。RPy2 是 RPy 最近开发的一个分支,它使用 Python 对象来引用 R 对象,而不是将它们复制回 Python 对象。这种策略避免了频繁的数据转换并提高了速度。但是,内存消耗仍然是一个问题。[...] 当我们实施 WebArray (Xia et al. 2005),一个用于微阵列数据分析的在线平台时,如果通过 RPy 而不是通过 R 的命令行用户界面运行 R,则一项工作消耗大约四分之一的计算时间。所以,我们决定在后续开发中通过管道在 Python 中运行 R,例如 WebArrayDB (Xia et al. 2009),它保留了与独立运行 R 时相同的性能。我们不知道造成这种性能差异的确切原因,但我们注意到 RPy 直接使用 R 的共享库来运行 R 脚本。相反,通过管道运行 R 意味着直接运行 R 解释器。
内存:
R 因其对内存的不经济使用而受到谴责。大型 R 对象使用的内存在这些对象被删除后很少被释放。有时从 R 释放内存的唯一方法是退出 R。RPy 模块将 R 包装在 Python 对象中。但是,即使删除了 Python 对象,R 库也会保留在内存中。换句话说,在宿主 Python 脚本终止之前,R 使用的内存无法释放。
可移植性:
作为用 C 编写的扩展模块,RPy 源包必须在 POSIX(Unix 的可移植操作系统接口)系统上使用特定的 R 版本编译,并且 R 必须在启用共享库的情况下编译。此外,Windows 的二进制发行版绑定到不同版本的 Python/R 的特定组合,因此用户经常很难找到适合用户软件环境的发行版。

于 2011-04-12T16:31:26.570 回答
5

在 pyper 中,我无法使用 assign() 将大矩阵从 python 传递到 r 实例。但是,我对 rpy2 没有问题。这只是我的经验。

于 2012-11-29T22:57:53.057 回答
5

从开发人员的角度来看,我们曾经使用 rpy/rpy2 为我们基于 Python 的应用程序提供统计和绘图功能。它在交付我们的应用程序时造成了巨大的问题,因为 rpy/rpy2 需要针对 Python 和 R 的特定组合进行编译,这使得我们无法提供开箱即用的二进制分发,除非我们也捆绑 R。因为 rpy/rpy2 不是特别容易安装,所以我们最终将相关部分替换为原生 Python 模块,例如 matplotlib。如果我们必须使用 R,我们会切换到 pyrserve,因为我们可以在本地启动 R 服务器并连接到它,而不必担心 R 的版本。

于 2015-03-11T15:12:49.073 回答