rpy2: как вернуть вектор в R из функции обратного вызова Python? - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь вызвать функцию в пакете R из Python.Для функции R требуется функция обратного вызова, которая принимает вектор значений, выполняет некоторые вычисления и возвращает вектор результата.

Я могу заставить работать обратный вызов, но только если он возвращает скаляр.Все попытки вернуть более одного значения приводят к тому, что rpy2 выдает ошибку ValueError.

Из rpy2.robject я пробовал FloatVectors и IntVectors.Я также попытался преобразовать мой список Python в массив данных или массив pandas, а затем использовать интерфейсы rpy2 для их преобразования.Ничего не работает.

Чтобы было ясно, я могу успешно использовать все эти методы для создания объектов, которые я могу передать из Python в список аргументов функции R.Я получаю сообщение об ошибке только при попытке вернуть вектор из обратного вызова Python.

Я перевел проблему в простой тест.Вот код R, который принимает и затем вызывает функцию обратного вызова:

Test <-
function(cb) {
    cb()
}

И вот код Python, который я использую для вызова кода R:

import rpy2.rinterface as ri
from rpy2 import robjects

robjects.r('source("Test.R")')
test = robjects.r['Test']

@ri.rternalize
def cb_test():

    return robjects.FloatVector([1.0, 2.0, 3.0])

test(cb_test)

Ожидаемый результат:

FloatVector with 3 elements.
1.000000    2.000000    3.000000

Фактический результат:

<class 'ValueError'>: [1] 1 2 3

Заранее спасибо всем, кто может понять, что я делаю неправильно.

1 Ответ

0 голосов
/ 19 апреля 2019

Проблема также может быть воспроизведена просто:

import rpy2.rinterface as ri
ri.initr()

@ri.rternalize
def cb_test():
    return ri.FloatSexpVector([1.0, 2.0, 3.0])

cb_test()

Это, похоже, проблема, которая теперь отслеживается здесь: https://bitbucket.org/rpy2/rpy2/issues/538/

Редактировать: есть первоначальное исправление врепозитории и исправление ошибок в rpy2 обычно выполняются в выходные дни.

...