通过 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 模块(就像 rpy2
的 importr()
一样,但是无需在 R 包中包含 R 代码):
我正在尝试构建一个 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 模块(就像 rpy2
的 importr()
一样,但是无需在 R 包中包含 R 代码):