使用 rpy2 从包中的多个模块访问单个 R 实例

Access a single R instance from multiple modules in package using rpy2

如何确保只有一个 R 实例 运行 并且可以使用 rpy2 从包中的模块访问?

例如,假设包 foobar 的顶层具有模块 foo.py 和 bar.py,以及带有测试模块 test_[=29= 的子包“tests” ]:

.
├── tests
│   ├── __init__.py
│   ├── test_foo.py
├── foo.py
├── bar.py
├── __init__.py

可以在一个地方导入 rpy2,比如说,顶层 init.py,然后让所有其他模块导入 robjs。比如顶层init.py可以是:

from rpy2.robjects.packages import importr
import rpy2.robjects as robjs
import rpy2.robjects.conversion as cv
from import rpy2.robjects import pandas2ri

然后在其他模块中:

import foobar

# Do stuff with foobar.robjs, foobar.cv, foobar.pandas2ri

或者是否有更好的安排让模块共享同一个 R 实例?

Packages/modules 是 Python 中的单例(在同一程序中的所有导入中,每个模块只有一个“副本”)。

您可以 import rpy2.robjects as robjs 任意多次并跨任意多个模块,它将在一个进程中使用完全相同的 R“实例”。

要验证这一点,您可以将以下代码片段添加到您为程序编写的所有模块中:

import rpy2.robjects as ro
rvar_name = 'import_%s' % __name__
ro.globalenv[rvar_name] = True
print('---')
print(__name__)
print(tuple(ro.globalenv.keys()))
print('---')