2015-02-24 57 views
1

如果rgl軟件包安裝在Rpython內負載rgl檢查,我在合併這兩個問題給配方:rpy2無法導入「RGL」 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!

+1

是'如果PACKNAME ==「rlg''一個錯字,應該'rgl'? – Spacedman 2015-02-24 14:33:27

+0

@Spacedman你是對的!你的評論讓我意識到代碼的實際工作,我編輯了這個問題來展示這一點。謝謝! – Gabriel 2015-02-24 14:51:04

回答

1

你不能那樣做。 rgl包需要一個OpenGL設備,但是在rpy2的範圍內運行更像是運行無頭。

+0

這是否意味着我無法從'python'腳本中檢查'r'包是否可用? – Gabriel 2015-02-24 13:22:51

+1

你需要一個測試,確實需要加載,因爲你不能從rpy2那樣做機智rgl。看例如'installed.packages()'。 – 2015-02-24 13:26:44

+0

該功能似乎是我需要的,謝謝!現在我只需要弄清楚如何正確讀取其輸出:http://stackoverflow.com/questions/28697549/read-r-function-output-as-columns – Gabriel 2015-02-24 13:51:21

0

我將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列表。

+1

很好的發佈答案,但它是一個_modified_問題的答案:)你最初並沒有問「我怎麼找到安裝的東西」... – 2015-02-24 14:57:44

+0

你是對的,Dirk,我最初說我想_load_該包並非如此(請參閱:http://stackoverflow.com/revisions/28687322/1)我已經爲反映此編輯的問題添加了一條交叉輸出行。 – Gabriel 2015-02-24 15:03:45

1

你幾乎肯定不會修復所有創建錯誤的符號。在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) 
+0

太棒了。如果我知道怎麼做,我會這樣做:)謝謝! – Gabriel 2015-02-24 15:36:21