2013-04-02 2 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") 

В общем, я бы рекомендуем не пытаться писать много R-кода внутри Python. Просто создайте несколько высокоуровневых 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

думаю. Без 'contriburl' в вызове' install_packages() ', R запрашивает интерактивный ввод о том, какое зеркало использовать ... и я предположил, что вы хотите что-то полностью автоматизированное (если интерактивный режим прекрасен, просто удалите' contriburl') – lgautier

+0

Извините, что обратился к вам только сейчас. Я попробовал ваше решение, но получил это сообщение об ошибке: «Предупреждающее сообщение: В библиотеке (пакет, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,: нет пакета под названием ' gtools ' Ошибка в .Primitive ("as.environment") ("package: gtools"): нет элемента под названием "package: gtools" в списке поиска' –

Смежные вопросы