要如果檢查,我在合併這兩個問題給配方:rpy2無法導入「RGL」 R包rgl
軟件包安裝在R
從python
內負載rgl
包
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!
是'如果PACKNAME ==「rlg''一個錯字,應該'rgl'? – Spacedman 2015-02-24 14:33:27
@Spacedman你是對的!你的評論讓我意識到代碼的實際工作,我編輯了這個問題來展示這一點。謝謝! – Gabriel 2015-02-24 14:51:04