读取R函数输出作为列

2024-07-03 08:10:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想想出一个办法来解决我昨天问的这个问题:

rpy2 fails to import 'rgl' R package

我的目标是检查某些包是否安装在Rpython内。在

按照Dirk Eddelbuettel在对his answer的评论中给出的建议,我使用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

它将返回一个相当大的表单输出:

^{pr2}$

我只需要提取安装的包的名称,所以第一列或第二列就足够了。在

我尝试过使用np.loadtxt()np.genfromtxt()with open(rpack) as csvfile:,但是没有一个能够返回列或行被正确分隔的列表/数组(它们实际上都失败了,错误不同)。在

如何以列的形式读取这个输出,或者更确切地说,在列表/数组中提取已安装包的名称?在


Tags: installedfromimport名称列表packagesnputils
2条回答

在您的例子中,rpack是一个rpy2.robjects.vectors.Matrix对象。因此,您只需使用rpy2类方法.rx()来提取列:

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

试试看。在

我以前没有使用过r2py,但它看起来像是某种r2py对象,而且它可能有一个选项来只抓取第一列。在

不过,您可以像文本文件一样解析它;当您调用print XXX时,它会获取对象的字符串表示形式。在

尝试这样做:

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

您应该同时尝试strrepr方法来获得字符串表示,但是有些人不会同时使用这两种方法,或者使用它们的方式不同。在

不过,这并不是最干净的方法,您必须确保正确地解析数据。尝试打印dir(rpack),看看是否有任何属性听起来像是包含了您想要的内容。在

稍微挖掘一下,安装的软件包文档,以及快速浏览一下R教程,就可以这样做:

^{pr2}$

相关问题 更多 >