【问题标题】:rpy2 fails to import 'rgl' R packagerpy2 无法导入“rgl”R 包
【发布时间】:2015-02-24 02:43:23
【问题描述】:

加载rgl检查rgl 包是否从python 中安装到R,我正在结合这两个问题中给出的配方:

rpy2: check if package is installed

rpy2 importr failing with xts and quantmod

这是我整理的 MWE:

from rpy2.rinterface import RRuntimeError
from rpy2.robjects.packages import importr
utils = importr('utils')

def importr_tryhard(packname, contriburl):
    try:
        if packname == 'rlg':
            rgl = importr("rgl", robject_translations = {".rgl.abclines": "_rgl_abclines2"})
        else:
            rpack = importr(packname)
            print 'success'
    except RRuntimeError:
        print 'no pack'
        rpack = 'none'
    return rpack

packname = 'rgl'
contriburl = 'http://cran.stat.ucla.edu/'
importr_tryhard(packname, contriburl)

上面的代码一直失败并报错:

rpy2.robjects.packages.LibraryError: Conflict when converting R symbol in the package "rgl" to a Python symbol (rgl.abclines -> rgl_abclines while there is already rgl_abclines)

根据本题开头链接的第二个问题给出的答案,行:

rgl = importr("rgl", robject_translations = {".rgl.abclines": "_rgl_abclines2"})

应该注意这个错误,但显然不是。

我在这里做错了什么?


编辑

Spacedman 下面的评论让我意识到上面的原始问题中有一个错字(if packname == 'rlg' 应该是if packname == 'rgl')。更正这个错字,我能够使代码工作,如下:

from rpy2.rinterface import RRuntimeError
from rpy2.robjects.packages import importr
utils = importr('utils')

def importr_tryhard(packname, contriburl):
    try:
        if packname == 'rgl':
            rpack = importr("rgl", robject_translations = {"rgl.abclines": "rgl_abclines2",
                "rgl.attrib": "rgl_attrib2", "rgl.attrib.count": "rgl_attrib_count2",
                "rgl.bbox": "rgl_bbox2", "rgl.bg": "rgl_bg2", "rgl.clear": "rgl_clear2",
                "rgl.dev.list": "rgl_dev_list2", "rgl.getcolorcount": "rgl_getcolorcount2",
                "rgl.getmaterial": "rgl_getmaterial2", "rgl.ids": "rgl_ids2",
                "rgl.init": "rgl_init2", "rgl.light": "rgl_light2", "rgl.material": "rgl_material2",
                "rgl.pixels": "rgl_pixels2", "rgl.planes": "rgl_planes2", "rgl.pop": "rgl_pop2",
                "rgl.postscript": "rgl_postscript2", "rgl.primitive": "rgl_primitive2",
                "rgl.quit": "rgl_quit2", "rgl.selectstate": "rgl_selectstate2",
                "rgl.setMouseCallbacks": "rgl_setMouseCallbacks2", "rgl.setselectstate": "rgl_setselectstate2",
                "rgl.snapshot": "rgl_snapshot2", "rgl.spheres": "rgl_spheres2", "rgl.sprites": "rgl_sprites2",
                "rgl.surface": "rgl_surface2", "rgl.texts": "rgl_texts2", "rgl.user2window": "rgl_user2window2",
                "rgl.viewpoint": "rgl_viewpoint2", "rgl.window2user": "rgl_window2user2"})
        else:
            rpack = importr(packname)
        print 'success'
    except RRuntimeError:
        print 'no pack'
        rpack = 'none'
    return rpack

packname = 'rgl'
contriburl = 'http://cran.stat.ucla.edu/'
importr_tryhard(packname, contriburl)

所以它确实有效,但它非常麻烦和丑陋。我建议使用我在my answer below 中发布的代码,这是检查已安装包的更好方法。

感谢 Spacedman!

【问题讨论】:

  • if packname == 'rlg' 一个错字,应该是rgl?
  • @Spacedman 你是对的!您的评论让我意识到代码确实有效,我编辑了问题以显示这一点。谢谢!

标签: python r rpy2


【解决方案1】:

你不能那样做。 rgl 包需要一个 OpenGL 设备,但在 rpy2 的范围内运行更像是无头运行。

【讨论】:

  • 这是否意味着我根本无法从python 脚本中检查rgl 包是否在R 中可用?
  • 您需要一个需要加载的测试,因为您无法使用 rpy2 中的 rgl 执行此操作。看看例如installed.packages()
  • 那个功能好像是我需要的,谢谢!现在我只需要弄清楚如何正确读取它的输出:stackoverflow.com/questions/28697549/…
  • 我不认为这是正确的。通过 rpy2 嵌入的 R 可以像在其 R 控制台中运行的 R 一样具有交互性。
  • 当我在无头环境中针对反向测试 Rcpp 时,加载 rgl 经常失败。如果您是交互式的,那么通过 rpy2 的 rgl 可能会很好地工作 --- 但这不是我们通常运行(自动、cron-drive)部署测试的地方。
【解决方案2】:

您几乎可以肯定不会修复所有产生错误的符号。在rgl 的情况下,有很多因此可以考虑使用替代名称翻译规则来构建字典。

例如,将'.' -> '_' 更改为'.' -> '__'

from rpy2.robjects.packages import importr
base = importr('base')
base.library('rgl')
env = base.asNamespace('rgl')
d = dict()
for k in env:
    if '.' in k:
        new_k = k.replace('.',  '__')
        d[k] = new_k
rgl = importr("rgl", robject_translations=d)

【讨论】:

  • 太棒了。如果我知道该怎么做,我会这样做:) 谢谢!
【解决方案3】:

我将 Dirk 的回答标记为已接受,因为他是对的。尽管如此,我还是在这里发布我自己的答案来展示我是如何解决这个问题的。

代码如下:

from rpy2.robjects.packages import importr
utils = importr('utils')

def importr_tryhard():
    contriburl = 'http://cran.stat.ucla.edu/'   
    try:
        pack_lst = utils.installed_packages()
        rpack = list(pack_lst.rx(True, 1))
    except RRuntimeError:
        rpack = []
    return rpack

rpack = importr_tryhard()
print rpack

这将返回(存储在rpack 中)R 中所有可用包的列表。

【讨论】:

  • 很高兴发布答案,但这是对 modified 问题的答案 :) 您最初并没有询问“我如何找到已安装的内容”.. .
  • 你是对的 Dirk,我最初说我想 load 包,但事实并非如此(参见:stackoverflow.com/revisions/28687322/1)我添加了一个划掉反映此编辑的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
相关资源
最近更新 更多