簡體   English   中英

rpy2無法導入“ rgl” R包

[英]rpy2 fails to import 'rgl' R package

加載rgl軟件包,請檢查rgl軟件包是否已從python安裝在R ,我將結合以下兩個問題中給出的配方:

rpy2:檢查軟件包是否已安裝

rpy2導入器因xts和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)

因此它確實有效,但是卻非常麻煩和丑陋。 我建議使用我在下面的答案中發布的代碼,這是檢查已安裝軟件包的更好的方法。

謝謝Spacedman!

你不能那樣做。 rgl軟件包需要OpenGL設備,但是在rpy2范圍內運行更像是無頭運行。

幾乎可以肯定,您並沒有修復所有創建錯誤的符號。 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)

我將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

這將返回(存儲在rpackR中所有可用軟件包的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM