Вызов пользовательских функций из Python с использованием rpy2

Есть ли способ вызвать функции, определенные в файле, скажем, myfunc.r

---------------myfunc.r --------------
myfunc = function(){
  return(c(1,2,3,4,5,6,7,8,9,10))
}

getname = function(){
  return("chart title")
}

---- Python 
   How to call getname() here ?

Любая помощь будет принята с благодарностью?


person user2171582    schedule 14.03.2013    source источник
comment
Почему вы определяете myfunc здесь?   -  person agstudy    schedule 15.03.2013
comment
@agstudy: я думаю, просто пример, показывающий, что файл может содержать несколько функций.   -  person lgautier    schedule 15.03.2013


Ответы (3)


В rpy2 есть функции, которые должны помочь сделать это чище, чем сброс объектов в глобальное рабочее пространство.

from rpy2.robjects.packages import STAP
# if rpy2 < 2.6.1 do:
# from rpy2.robjects.packages import SignatureTranslatedAnonymousPackage
# STAP = SignatureTranslatedAnonymousPackage
with open('myfunc.r', 'r') as f:
    string = f.read()
myfunc = STAP(string, "myfunc")

Доступ к объектам в файле R теперь можно получить с помощью myfunc.myfunc и myfunc.getname.

Ознакомьтесь с документацией о импорт произвольного кода R в виде пакета.

person lgautier    schedule 15.03.2013
comment
SignatureTranslatedAnonymousPackage Название немного длинное, я думаю... для разработчиков R и Python :) - person agstudy; 15.03.2013
comment
Да, возможно, это феерия Java в конце спектра именования, но все же менее 140 символов ;-). Более короткое имя класса при сохранении ясности означало бы введение подпакета. Также приветствуются предложения по названиям. - person lgautier; 15.03.2013
comment
Конечно, я пришел из мира .net и знаю, что вы имеете в виду. rpy2 - отличная работа. Я ценю. +1 .. длинное имя, но чистое решение! Я думаю, вы можете просто добавить import SignatureTranslatedAnonymousPackage as STAP, например... - person agstudy; 15.03.2013
comment
@agstudy: я отредактировал фрагмент кода; теперь настоящее имя класса записывается только один раз - person lgautier; 16.03.2013
comment
string = ''.join(f.readlines()) выдаст ошибки. То, что вы должны сделать для R версии 3.2.0 (на момент написания), похоже на эту строку = f.read().replace('\n', '') - person momokjaaaaa; 09.06.2015
comment
@momokjaaaaa Да. Я исправил ответ. Спасибо. - person lgautier; 07.07.2015
comment
Я попробовал это, за исключением того, что моя функция называется calc_num, поэтому я запустил myfunc=STAP(string, "calc_num") и получил rpy2.rinterface.RParsingError - person KillerSnail; 10.10.2016
comment
@KillerSnail: RParsingError указывает, что при синтаксическом анализе исходного кода R, содержащего вас, строка Python string R остановилась с ошибкой синтаксического анализа. Другими словами, все, что находится в string, не казалось допустимым кодом для самого R. - person lgautier; 10.10.2016

Вы можете сделать что-то вроде этого (код python здесь)

import rpy2.robjects as robjects
robjects.r('''
       source('myfunc.r')
''')

 r_getname = robjects.globalenv['getname']

тогда вы называете это

r_getname()
person agstudy    schedule 14.03.2013
comment
Это все еще работало для меня в 2016 году с R-3.2.2 и rpy2=2.7.0 :) - person Sudipta Basak; 09.03.2016

Я бы предложил использовать то, что user3282437 предложил здесь:

import rpy2.robjects as robjects
r_source = robjects.r['source']
r_source('/path_to_file/myfunc.R')
r_getname = robjects.globalenv['getname']

Я не уверен, что это глобальная проблема, но на моей машине с Windows прямой вызов, такой как agstudy, посоветовал:

import rpy2.robjects as robjects
robjects.r('source("some_file.R")')

приводит к сбою Python.

person Dmitry Deryabin    schedule 01.06.2014