我想从 Python 程序中访问 R。我知道 Rpy2、pyrserve 和 PypeR。
这三个选项的优点或缺点是什么?
我比其他人更了解这三个中的一个,但是按照问题中给出的顺序:
rpy2:
焦糖:
派珀:
编辑: Windows 对 rpy2 的支持
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 的特定组合,因此用户经常很难找到适合用户软件环境的发行版。
在 pyper 中,我无法使用 assign() 将大矩阵从 python 传递到 r 实例。但是,我对 rpy2 没有问题。这只是我的经验。
从开发人员的角度来看,我们曾经使用 rpy/rpy2 为我们基于 Python 的应用程序提供统计和绘图功能。它在交付我们的应用程序时造成了巨大的问题,因为 rpy/rpy2 需要针对 Python 和 R 的特定组合进行编译,这使得我们无法提供开箱即用的二进制分发,除非我们也捆绑 R。因为 rpy/rpy2 不是特别容易安装,所以我们最终将相关部分替换为原生 Python 模块,例如 matplotlib。如果我们必须使用 R,我们会切换到 pyrserve,因为我们可以在本地启动 R 服务器并连接到它,而不必担心 R 的版本。