Интеграция кода R через rpy2 в пакет Python - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь собрать пакет 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, но, очевидно, это не сработает, когда я попытаюсь распространить пакет.Как я могу сгенерировать абсолютный путь к файлу ресурса в пакете таким образом, чтобы он был zip-safe?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Вы решили проблему с путем в вашем пакете.Ниже приведено лишь упоминание кода удобства в rpy2, который позволяет автоматически сопоставлять исходный файл R с модулем Python (как это делает rpy2 importr(), но без необходимости иметь код R вR пакет):

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

0 голосов
/ 20 сентября 2019

... и я понял это.Ответ в случае, если другие люди имеют подобную форму этой проблемы.

В 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']
...