2013-04-02 194 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」的項目# –