2013-04-02 195 views
2

使用rpy2,我想检查是否安装了给定的包。如果是,我将它导入。如果没有,我先安装它。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") 

回答

1

您可以使用下面的功能我从@ SaschaEpskamp的回答得到了another SO post

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之间的最小接口。

+0

谢谢!我不太熟悉R语句到Python语句的转换。我将如何在python中编写上面的代码片段? –

+1

我对他们也不熟悉,但我认为我上面给出的片段应该可以工作。只要将这个函数保存到一个文件中,源文件并运行它。 –

-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' 
+0

您能否提供一些上下文给这段代码?特别是它如何连接到正在运行的R会话并检索是否安装了特定的软件包。尽管这可能起作用,但我发现代码很难阅读。存在更简单和明确的方法,例如,看到我的答案。 –

+0

pip freeze将列表转储获取到系统 – Mohan

+0

中的所有软件包列表中,然后根据新行分割输出数据并检查它。 – Mohan

5

这里是一个会做它在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 
+0

谢谢!至于CRAN镜像,我应该从这个清单中选择一个http://cran.r-project.org/mirrors.html? –

+0

我这么认为。如果在调用install_packages()时没有'contriburl',R就要求交互式地输入关于要使用哪个镜像......并且我猜测你想要一些完全自动化的东西(如果交互很好,只需移除' contriburl') – lgautier

+0

对不起,现在才回复你。我尝试了你的解决方案,但是我得到了这个错误信息:'警告信息: 在库中(package,lib.loc = lib.loc,character.only = TRUE,logical.return = TRUE,: 没有名为' gtools' .Primitive(“as.environment”)(“package:gtools”)中的错误: 在搜索列表中没有名为“package:gtools”的项目# –