2015-02-24 67 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