【问题标题】:Calling Custom functions from Python using rpy2使用 rpy2 从 Python 调用自定义函数
【发布时间】:2013-03-03 10:04:42
【问题描述】:

有没有办法调用文件中定义的函数,比如 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:我认为只是一个表明文件可以包含多个函数的示例。

标签: python r rpy2


【解决方案1】:

你可以做这样的事情(这里是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 :)
【解决方案2】:

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 文件中的对象。

查看有关importing arbitrary R code as a package的文档。

【讨论】:

  • SignatureTranslatedAnonymousPackage 这个名字我觉得有点长..对于R和python的开发者来说:)
  • 是的,可能在命名范围的 Java 盛会结束,但仍低于 140 个字符 ;-)。一个较短的类名同时保持清晰意味着引入一个子包。也欢迎提供名称建议。
  • 当然,我来自 .net 世界,我知道您的意思。 rpy2 是一个伟大的工作。我很感激。 +1 .. 长名称但干净的解决方案!我认为您可以添加 import SignatureTranslatedAnonymousPackage as STAP 例如...
  • @agstudy:我编辑了代码 sn-p;现在真正的类名只写一次
  • string = ''.join(f.readlines()) 会出错。你应该为 R 版本 3.2.0 做的(当时或写作)就像这样 string = f.read().replace('\n', '')
【解决方案3】:

我建议使用 user3282437 建议 here:

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崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2017-07-24
    • 2014-08-24
    • 1970-01-01
    • 2019-09-05
    相关资源
    最近更新 更多