通过 rpy2 将 R 代码集成到 Python 包中

Integrating R code via rpy2 into a Python package

我正在尝试构建一个 Python 包,并使用 rpy2 和一些 R 脚本将 R 无缝集成到该包中。

这是我之前在 Jupyter 笔记本中制作原型的代码。这通常看起来像:

import rpy2

# load in R script containing some useful functions
rpy2.robjects.r("source('feature.R')")

# generate a python binding for 'useful_func' described in the R script
useful_func = rpy2.robjects.globalenv['useful_func']

result = useful_func(data)

这在 Jupyter 中运行良好,只要我所有的 R 脚本都在与我正在使用的笔记本相同的目录中。

我尝试构建的包看起来像:

package/
 -__init__.py
 -package.py 
 -lib/
  -__init__.py
  -feature1.py
  -feature1.R

我可以轻松导入 feature1,但是当它尝试获取源时 feature1.R,R 找不到该文件。我可以通过提供 feature1.R 的绝对路径来解决这个问题,但显然这在我尝试分发包时不起作用。如何以压缩安全的方式生成包内资源文件的绝对路径?

...我想通了。回答以防其他人有类似形式的此问题。

在feature1.py中:

import importlib.resources as pkg_resources 
import rpy2

with pkg_resources.path('lib', 'feature1.R') as filepath:
    rpy2.robjects.r("source('" + str(filepath) + "')")

useful_func = rpy2.robjects.globalenv['useful_func']

您已经自行解决了包中路径的问题。以下仅提及 rpy2 中的方便代码,让您自动将 R 源文件映射到 Python 模块(就像 rpy2importr() 一样,但是无需在 R 包中包含 R 代码):

https://rpy2.github.io/doc/v3.1.x/html/robjects_rpackages.html#importing-arbitrary-r-code-as-a-package