2013-07-16 2 views
8

Quando installo il pacchetto yaml, un fastidioso messaggio di errore compare in RStudio se era stato precedentemente installato. Come posso sapere se il pacchetto era già installato, quindi posso decidere nel mio codice se installare il pacchetto o no?Come posso sapere se un determinato pacchetto è già stato installato?

il messaggio è in una finestra pop-up ed è:

Uno o più dei pacchetti che saranno aggiornati da questa installazione attualmente caricati. Il riavvio di R prima dell'aggiornamento di questi pacchetti è consigliato per lo . RStudio può riavviare R e quindi automaticamente continuare l'installazione dopo il riavvio (tutti i dati e il lavoro saranno protetti durante il riavvio). Vuoi riavviare R prima dell'installazione di ?

+0

Non riproducibile. Non ricevo alcun messaggio di errore. (Ricevo un messaggio informativo che mi dice che è stato installato.) Ah. È un messaggio informativo RStudio, non un messaggio da R. –

+0

... Perché stai provando ad installarlo ripetutamente? Il comando per caricare un pacchetto installato è 'library (foo)'. Stai eseguendo 'install.packages' per errore? –

+1

Scrivo codice che verrà eseguito su computer che non hanno mai utilizzato R prima. Quindi il codice deve prima installare install.packages ("yaml"). Sono preoccupato che se un utente esegue il codice due volte di seguito per qualche motivo, il messaggio verrà visualizzato e verrà confuso. – kng

risposta

12

Questo caricherà yaml, installarlo prima se non è già installato:

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

o se si vuole parametrizzare esso:

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

UPDATE. Parametrizzazione.

+0

Grazie! Questo funziona perfettamente. – kng

+0

Molto meglio del mio "tryCatch' hack. Adotterà. – krlmlr

8

è possibile utilizzare installed.packages() per trovare pacchetti installati

1

Sto usando la seguente costruzione nel mio codice. La parte essenziale è di chiamare library all'interno tryCatch e installarlo se non riesce:

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   
) 

La funzione lib.auto installa da CRAN e Bioconductor, se necessario. Le installazioni lib.auto.github da GitHub.

Sto pensando di inserire questo codice in un pacchetto.

3

In alternativa, è possibile utilizzare la funzione require. Proverà a caricare il pacchetto e silenziosamente restituirà un logico affermando se il pacchetto è disponibile o meno. C'è anche un avvertimento se il pacchetto non può essere caricato.

test1 <- require("stats") 
test1 

test2 <- require("blah") 
test2