2013-07-16 1 views
8

Когда я устанавливаю пакет yaml, в RStudio появляется сообщение об ошибке, если оно было ранее установлено. Как я могу определить, был ли пакет уже установлен, поэтому я могу решить в своем коде, устанавливать ли пакет или нет?Как узнать, установлен ли определенный пакет?

сообщение в всплывающем окне, и это:

Один или несколько пакетов, которые будут обновлены с помощью этой установки загружены в данный момент. Перезагрузка R перед обновлением этих пакетов - настоятельно рекомендуется. RStudio может перезапустить R, а затем автоматически продолжить установку после перезапуска (все работы и данные будут сохранены во время перезапуска). Вы хотите перезапустить R до установки ?

+0

Не воспроизводимый. Я не получаю сообщение об ошибке. (Я получаю информационное сообщение о том, что оно было установлено.) Ах. Это информационное сообщение RStudio, а не сообщение от R. –

+0

... Почему вы пытаетесь установить его повторно? Команда для загрузки установленного пакета - 'library (foo)'. Вы используете 'install.packages' по ошибке? –

+1

Я пишу код, который будет запускаться на компьютерах, которые раньше никогда не использовали R. Таким образом, код должен иметь install.packages («yaml»). Я обеспокоен тем, что, если пользователь по какой-то причине запускает код дважды подряд, сообщение появится и они будут запутаны. – kng

ответ

12

Это загрузит yaml, устанавливая его первым, если его не установлена:

if (!require(yaml)) { 
    install.packages("yaml") 
    library(yaml) 
} 

или если вы хотите параметрирование:

pkg <- "yaml" 
if (!require(pkg, character.only = TRUE)) { 
    install.packages(pkg) 
    if (!require(pkg, character.only = TRUE)) stop("load failure: ", pkg) 
} 

UPDATE. Параметризация.

+0

Спасибо! Это прекрасно работает. – kng

+0

Гораздо лучше, чем мой 'tryCatch' взломать. Принят. – krlmlr

8

вы можете использовать installed.packages() найти установленные пакеты

1

Я использую следующую конструкцию в моем коде. Существенная часть о вызове library в tryCatch и установить его, если он не:

lib.auto <- function(lib, version=NULL, install.fun=install.packages, ...) { 
    tryCatch(
    library(lib, character.only=T), 
    error=function(e) { 
     install.fun(lib, ...) 
     library(lib, character.only=T) 
    } 
) 
    if (!is.null(version)) { 
    if (packageVersion(lib) < version) { 
     require(devtools) 
     detach(paste0('package:', lib), unload=T, character.only=T) 
     install.fun(lib, ...) 
     library(lib, character.only=T) 
     if (packageVersion(lib) < version) { 
     stop(sprintf('Package %s not available in version %s. Installed version: %s', lib, version, 
        packageVersion(lib))) 
     } 
    } 
    } 
} 

lib.auto('BiocInstaller', 
     install.fun=function(lib) { 
      source("http://bioconductor.org/biocLite.R") 
      biocLite(lib) 
     }) 

options(repos=biocinstallRepos()) 
lib.auto.bioc <- lib.auto 

lib.auto.github <- function(lib, version=NULL, user, subdir=NULL, repo=lib) 
    lib.auto(lib, version=version, 
      install.fun=function(l, u, s, r) { 
      require(devtools) 
      install_github(r, u, subdir=s) 
      }, 
      user, subdir, repo   
) 

lib.auto функция устанавливает от CRAN и Bioconductor, если это необходимо. lib.auto.github устанавливается из GitHub.

Я думаю о том, чтобы направить этот код в пакет.

3

В качестве альтернативы вы можете использовать функцию require. Он попытается загрузить пакет и тихо вернуться к логическому утверждению, доступен ли пакет. Существует также предупреждение, если пакет не может быть загружен.

test1 <- require("stats") 
test1 

test2 <- require("blah") 
test2