rpy2无法导入'rgl'R packag

2024-07-03 07:57:49 发布

您现在位置:Python中文网/ 问答频道 /正文

为了加载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)

以上代码一直失败,错误如下:

^{pr2}$

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

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!在


Tags: fromimportif错误utilsprintrpy2importr
3条回答

你不能那样做。rgl包需要OpenGL设备,但是在rpy2的限制下运行更像是运行headless。在

几乎可以肯定的是,不会修复所有的符号,从而导致错误。在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)

我认为德克的回答是可以接受的,因为他是对的。尽管如此,我还是在这里贴出我自己的答案来展示我是如何解决这个问题的。在

代码如下:

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)中所有可用包的列表。在

相关问题 更多 >