rpy2:检查软件包是否安装

3
使用rpy2,我想检查一个给定的软件包是否已安装。如果已安装,则导入它。如果没有安装,则先安装它。
如何检查软件包是否已安装?
from rpy2 import *
if not *my package is installed*:
   rpy2.interactive as r
   r.importr("utils")
   package_name = "my_package"
   r.packages.utils.install_packages(package_name)
myPackage = importr("my_package")
3个回答

7
这里是一个可以在Python端执行的函数 (请注意contriburl,它应该设置为CRAN镜像,并且不能处理安装库失败的情况)。
from rpy2.rinterface import RRuntimeError
from rpy2.robjects.packages import importr
utils = importr('utils')

def importr_tryhard(packname, contriburl):
    try:
        rpack = importr(packname)
    except RRuntimeError:
        utils.install_packages(packname, contriburl = contriburl)
        rpack = importr(packname)
    return rpack

谢谢!关于CRAN镜像,我应该从这个列表http://cran.r-project.org/mirrors.html中选择一个吗? - Ricky Robinson
我这样认为。在调用install_packages()时如果没有提供contriburl,R会要求交互式输入关于使用哪个镜像的信息... 我猜想您希望完全自动化(如果交互式可以,请删除 contriburl)。 - lgautier
抱歉现在才回复您。我尝试了您的解决方案,但是出现了以下错误信息:警告信息: 在library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : 没有叫做‘gtools’的包 Error in .Primitive("as.environment")("package:gtools") : 在搜索列表中没有名为"package:gtools"的项目 - Ricky Robinson
File "/home/me/myProject/myProject/myScript.py", line 51, in <module> gtools = importr_tryhard("gtools", "http://cran.cnr.Berkeley.edu") File "/home/me/myProject/myProject/myScript.py", line 42, in importr_tryhard rpack = importr(packname) File "/usr/lib/python2.7/dist-packages/rpy2/robjects/packages.py", line 117, in importr env = _as_env(rinterface.StrSexpVector(['package:'+name, ])) rpy2.rinterface.RRuntimeError: Error in .Primitive("as.environment")("package:gtools") : no item called "package:gtools" on the search list - Ricky Robinson
我本来期望importr()会引发LibraryError异常。我已经修复了代码片段,但现在没有时间查看这个可能的小问题与异常。也许可以提交一个错误报告。 - lgautier

1
你可以使用我从@SaschaEpskamp的答案中得到的以下函数来另一个SO帖子
pkgTest <- function(x)
  {
    if (!require(x,character.only = TRUE))
    {
      install.packages(x,dep=TRUE)
        if(!require(x,character.only = TRUE)) stop("Package not found")
    }
  }

请使用以下方式来加载您的包:
r.source("file_with_pkgTest.r")
r.pkgTest("utils")

通常情况下,我建议不要在Python中尝试编写太多的R代码。只需要创建几个高级别的R函数来执行所需的操作,并将它们用作R和Python之间的最小接口。


谢谢!我对将R语句转换为Python语句并不太熟悉。我该如何用Python编写上面的代码片段? - Ricky Robinson
1
我也不熟悉它们,但我认为我上面给出的代码片段应该可以工作。只需将此函数保存到文件中,源化该文件并运行即可。 - Paul Hiemstra

-1
   import sys,subprocess
   your_package = 'nltk' 

   package_names = subprocess.Popen([pip freeze], 
   stdout=subprocess.PIPE).communicate()[0]
   pakage = package_names.split('\n')

   for package in packages:
      if package ==your_package:
         print 'true'

你能提供一些关于这段代码的上下文吗?特别是它如何连接到正在运行的 R 会话并检索特定软件包是否已安装。尽管这可能有效,但我觉得这段代码很难读懂。存在更简单和清晰的方法,例如请参见我的答案。 - Paul Hiemstra
pip freeze 列出了系统中已安装的所有软件包。 - Mohan
将获取的列表转储到一个文件中,根据换行符拆分输出数据并进行检查。 - Mohan
2
我们在谈论的是Python内部的R包,而不是Python包。 - Paul Hiemstra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接