Я использую код r в python, используя модуль rpy2. У меня есть данные, загруженные в pandas фрейм данных, к которому я хотел бы получить доступ в коде r, который я передаю в виде текста во встроенный процесс r с помощью rpy2.
Я знаю, как все это сделать, но единственный способ Я могу понять, как получить доступ к фрейму данных pandas в коде r, это преобразовать фрейм данных pandas в фрейм данных r, а затем создать текстовое представление на языке r. Затем я интерполирую это представление в строку python, содержащую код r, который я передаю интерпретатору r.
Несмотря на то, что в моем примере с игрушкой, приведенным ниже, это работает нормально, он выглядит немного неуклюжим и, если возможно, Я хотел бы найти более программный c способ доступа к данным.
Одним из решений, которое я уже рассмотрел, было бы избегать непосредственного использования кода r и вместо этого писать все "в python", используя методы доступны в rpy2. Однако целью этого программного обеспечения является поддержка анализа данных в python с использованием небольших произвольных фрагментов кода r. Так что переписать все, используя rpy2, было бы невозможно (или, по крайней мере, крайне непрактично).
Любые предложения?
Вот минимальный рабочий пример, иллюстрирующий то, что я хочу сделать:
#!/usr/bin/env python3
import pandas as pd
import rpy2.robjects as robjects
import rpy2.robjects.packages as rpackages
from rpy2.robjects import pandas2ri
from rpy2.robjects.conversion import localconverter
# load data into a pandas dataframe
data = pd.DataFrame([[1,2],[2,4],[3,7]], columns=['A', 'B'])
# convert pandas dataframe into r dataframe
with localconverter(robjects.default_converter + pandas2ri.converter):
rdata = robjects.conversion.py2rpy(data)
# test that the r can work with the r format dataframe
base = rpackages.importr('base')
print(base.summary(rdata))
# access this new dataframe within r code passed as text
# this is the janky text interpolation method
rcode = '''
data <- %s
head(data)
''' % (rdata.r_repr())
print('interpolated r code:')
print(rcode)
# evaluate the r code
print(robjects.r(rcode))