使用rpy2从Python调用自定义函数

13

有没有办法调用在文件中定义的函数,比如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 ?

任何帮助都将不胜感激?


你为什么要在这里定义 myfunc 函数? - agstudy
@agstudy:这只是一个示例,展示文件可以包含多个函数,我想。 - lgautier
3个回答

21

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")

现在可以使用 myfunc.myfuncmyfunc.getname 访问 R 文件中的对象。

请查看有关将任意 R 代码导入为软件包的文档。


SignatureTranslatedAnonymousPackage 这个名字有点长,我想对于 R 和 Python 开发者来说 :) - agstudy
是的,也许在命名谱系的Java极端端点,但仍然不超过140个字符;-)。保持清晰的情况下缩短类名可能意味着引入子包。对于名称的建议也非常欢迎。 - lgautier
1
@agstudy:我编辑了代码片段,现在真实的类名只写了一次。 - lgautier
字符串 = ''.join(f.readlines()) 会出现错误。在 R 版本 3.2.0(撰写时)中,您应该这样做:字符串 = f.read().replace('\n', '')。 - momokjaaaaa
@momokjaaaaa 是的。我修正了答案。谢谢。 - lgautier
显示剩余3条评论

10
您可以像这样做(此处为Python代码)
import rpy2.robjects as robjects
robjects.r('''
       source('myfunc.r')
''')

 r_getname = robjects.globalenv['getname']

那么你就称它为

r_getname()

这个在2016年的时候对我仍然有效,使用R-3.2.2rpy2=2.7.0 :) - Sudipta Basak

2

我建议使用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 崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接