2015-02-24 138 views
-1

我試圖想出一個辦法來解決這個問題,我昨天問:讀R功能輸出列

rpy2 fails to import 'rgl' R package

我的目標是要檢查如果某些包內裝R從內python

Dirk Eddelbuettel,我使用的installed.packages()功能從R列出所有可用的軟件包上his answer在評論中給出的建議。

這是我到目前爲止有:

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

def importr_tryhard(packname, contriburl): 
    try: 
     rpack = utils.installed_packages() 
    except RRuntimeError: 
     rpack = [] 
    return rpack 

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

它返回一個相當大的輸出的形式爲:

  Package  LibPath       Version 
ks   "ks"   "/usr/local/lib/R/site-library" "1.8.13" 
misc3d  "misc3d"  "/usr/local/lib/R/site-library" "0.8-4" 
mvtnorm "mvtnorm" "/usr/local/lib/R/site-library" "0.9-9996" 
rgl  "rgl"  "/usr/local/lib/R/site-library" "0.93.986" 
base  "base"  "/usr/lib/R/library"   "3.0.1" 
boot  "boot"  "/usr/lib/R/library"   "1.3-9" 
class  "class"  "/usr/lib/R/library"   "7.3-9" 
cluster "cluster" "/usr/lib/R/library"   "1.14.4" 
codetools "codetools" "/usr/lib/R/library"   "0.2-8" 
compiler "compiler" "/usr/lib/R/library"   "3.0.1" 
datasets "datasets" "/usr/lib/R/library"   "3.0.1" 
foreign "foreign" "/usr/lib/R/library"   "0.8-49" 
graphics "graphics" "/usr/lib/R/library"   "3.0.1" 
grDevices "grDevices" "/usr/lib/R/library"   "3.0.1" 
grid  "grid"  "/usr/lib/R/library"   "3.0.1" 
KernSmooth "KernSmooth" "/usr/lib/R/library"   "2.23-10" 
lattice "lattice" "/usr/lib/R/library"   "0.20-23" 
MASS  "MASS"  "/usr/lib/R/library"   "7.3-29" 
Matrix  "Matrix"  "/usr/lib/R/library"   "1.0-14" 
methods "methods" "/usr/lib/R/library"   "3.0.1" 
mgcv  "mgcv"  "/usr/lib/R/library"   "1.7-26" 
nlme  "nlme"  "/usr/lib/R/library"   "3.1-111" 
nnet  "nnet"  "/usr/lib/R/library"   "7.3-7" 
parallel "parallel" "/usr/lib/R/library"   "3.0.1" 
rpart  "rpart"  "/usr/lib/R/library"   "4.1-3" 
spatial "spatial" "/usr/lib/R/library"   "7.3-6" 
splines "splines" "/usr/lib/R/library"   "3.0.1" 
stats  "stats"  "/usr/lib/R/library"   "3.0.1" 
stats4  "stats4"  "/usr/lib/R/library"   "3.0.1" 
survival "survival" "/usr/lib/R/library"   "2.37-4" 
tcltk  "tcltk"  "/usr/lib/R/library"   "3.0.1" 
tools  "tools"  "/usr/lib/R/library"   "3.0.1" 
utils  "utils"  "/usr/lib/R/library"   "3.0.1" 
      Priority  
ks   NA   
misc3d  NA   
mvtnorm NA   
rgl  NA   
base  "base"  
boot  "recommended" 
class  "recommended" 
cluster "recommended" 
... 

我需要提取安裝包只是名稱,所以無論是第一列還是第二列對我來說都足夠了。

我使用np.loadtxt()np.genfromtxt()with open(rpack) as csvfile:試過,但沒有能夠給回一個列表/數組,其中任一列或行被正確分離(他們都失敗,不同的錯誤實際上)。

我怎樣才能以列的形式讀取這個輸出,或者更多的問題,在列表/數組中提取已安裝軟件包的名稱?

+0

解釋downvote的評論會非常好。 – Gabriel 2015-02-24 14:08:01

+1

這不是我,但它可能與說你從這些嘗試中得到的錯誤有關,並沒有發佈錯誤。這裏的基本問題是,你試圖'打開'這個'rpack'對象,就好像它是一個文件(或者實際上,打開一個'rpack'命名的文件)。這些錯誤應該已經很明顯的出了什麼問題。 – will 2015-02-24 14:11:31

+0

謝謝你,我試圖不讓這個問題如此之大。下次我會發布_everything_。乾杯。 – Gabriel 2015-02-24 14:14:16

回答

1

rpack你的情況是rpy2.robjects.vectors.Matrix對象。因此,您可以簡單地使用rpy2類方法.rx()來提取列:

mylist = list(rpack.rx(True, 1)) 

試試看。

+0

這很好,謝謝! – Gabriel 2015-02-24 14:13:47

1

我以前沒有使用過r2py,但它看起來像是某種r2py對象,並且可能有一個選項可以抓住第一列。

儘管你可以像文本文件一樣簡單地解析它;當你調用print XXX時,它會抓取對象的字符串表示形式。

嘗試做這樣的事情:

s = str(rpack) 
packages = [line.split()[0] for line in s.split("\n")[1:]] 

你應該嘗試的strrepr方法,雖然得到的字符串表示,有些人不同時使用,或不同的方式使用它們。

雖然這並不是最乾淨的方式,但您必須確保正確解析數據。嘗試打印dir(rpack)並查看是否有任何屬性,聽起來像他們將包含你想要的。

挖一點點,在installed_pa​​ckages文件,並在R教程快速瀏覽一下建議你可以這樣做:

print mpack[,"Package"] 
+0

你的最後一行對我來說不起作用(你得到了什麼輸出?),但是根據你檢查'dir()的建議'我能夠想出這樣一行:'np.asarray(getattr(rpack ,'rownames'))'這正是我所需要的。非常感謝你! – Gabriel 2015-02-24 14:11:00

+0

我沒有'r2py',所以這些都沒有經過測試 - 我也無法看看該對象,看看我可能如何找到解決方案。 – will 2015-02-24 14:12:02