Python 将R函数输出读取为列
我正在想办法解决我昨天问的这个问题: 我的目标是从Python 将R函数输出读取为列,python,r,rpy2,Python,R,Rpy2,我正在想办法解决我昨天问的这个问题: 我的目标是从python中检查某些包是否安装在R中 根据评论中给出的建议,我使用R中的installed.packages()函数列出所有可用的软件包 到目前为止,我得到的是: from rpy2.rinterface import RRuntimeError from rpy2.robjects.packages import importr utils = importr('utils') def importr_tryhard(packname,
python
中检查某些包是否安装在R
中
根据评论中给出的建议,我使用R
中的installed.packages()
函数列出所有可用的软件包
到目前为止,我得到的是:
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()
和与open(rpack)一起用作csvfile:
,但没有一个能够返回正确分隔列或行的列表/数组(它们实际上都因不同的错误而失败)
我如何以列的形式读取此输出,或者更切题地提取列表/数组中已安装软件包的名称?我以前没有使用过
r2py
,但它看起来像是某种r2py
对象,可以选择只获取第一列
不过,您可能会像解析文本文件一样解析它;调用print XXX
时,它将获取对象的字符串表示形式
尝试这样做:
s = str(rpack)
packages = [line.split()[0] for line in s.split("\n")[1:]]
您应该尝试使用str
和repr
两种方法来获得字符串表示形式,但有些人并不同时使用这两种方法,或者使用方式不同
但这并不是最干净的方法,您必须确保正确解析数据。尝试打印dir(rpack)
并查看其中是否有任何属性听起来像是包含您想要的内容
稍加挖掘、安装的_软件包文档以及快速浏览R
教程,就可以做到这一点:
print mpack[,"Package"]
rpack
在您的例子中是一个rpy2.robjects.vectors.Matrix
对象。因此,只需使用rpy2类方法.rx()
即可提取列:
mylist = list(rpack.rx(True, 1))
试试看。一条解释否决票的评论会很好。不是我,但可能是说你在这些尝试中犯了错误,而不是发布错误。这里的基本问题是,您试图
打开这个rpack
对象,就像它是一个文件一样(或者实际上,打开一个文件,其中rpack
给出了它的名称)。这些错误应该让问题变得非常明显。谢谢威尔,我尽量不让问题变得这么大。下次我会把所有的东西都贴出来。干杯。你的最后一行对我不起作用(你得到了什么输出?),但根据你检查dir()
的建议,我想出了一行:np.asarray(getattr(rpack,'rownames'))
,这正是我需要的。非常感谢你,威尔!我没有r2py
,所以这些都没有经过测试——而且我也无法查看对象以了解如何找到解决方案。