Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将R函数输出读取为列_Python_R_Rpy2 - Fatal编程技术网

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
,所以这些都没有经过测试——而且我也无法查看对象以了解如何找到解决方案。