2013-07-16 17 views
8

Kiedy instaluję pakiet yaml, pojawia się denerwujący komunikat o błędzie w RStudio, jeśli został wcześniej zainstalowany. Jak mogę sprawdzić, czy pakiet został już zainstalowany, więc mogę w moim kodzie zdecydować, czy zainstalować pakiet, czy nie?Jak mogę sprawdzić, czy dany pakiet jest już zainstalowany?

Przesłanie jest w oknie pop-up i jest:

Jeden lub więcej pakietów, które zostaną zaktualizowane przez tę instalację są obecnie załadowane. Ponowne uruchamianie R przed aktualizacją tych pakietów jest zdecydowanie zalecane. RStudio może zrestartować R, a następnie automatycznie kontynuować instalację po ponownym uruchomieniu (cała praca i dane zostaną zachowane podczas przywracania). Czy chcesz zrestartować R przed instalacją ?

+0

Nie można odtwarzać. Nie otrzymuję komunikatu o błędzie. (Dostaję komunikat informacyjny informujący mnie, że został zainstalowany.) Ah. Jest to wiadomość informacyjna RStudio, a nie wiadomość od R. –

+0

... Dlaczego próbujesz zainstalować ją wielokrotnie? Polecenie załadowania zainstalowanego pakietu to 'library (foo)'. Czy używasz 'install.packages' przez pomyłkę? –

+1

Piszę kod, który będzie uruchamiany na komputerach, które nigdy wcześniej nie używały R. Dlatego kod musi najpierw mieć pakiet install.packages ("yaml"). Obawiam się, że jeśli użytkownik uruchomi kod dwa razy z rzędu z jakiegoś powodu, wiadomość pojawi się i będą zdezorientowani. – kng

Odpowiedz

12

To będzie ładować yaml, zainstalowanie go najpierw, jeśli jej nie już zainstalowane:

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

lub jeśli chcesz go parametryzacji:

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

zaktualizować. Parametryzacja.

+0

Dziękujemy! To działa idealnie. – kng

+0

Znacznie lepiej niż mój hack "tryCatch". Przyjmie. – krlmlr

8

można użyć installed.packages() znaleźć zainstalowane pakiety

1

używam następującą budowę w moim kodu. Zasadnicza część jest o wywołanie library ciągu tryCatch i instalowania go, jeśli nie powiedzie się:

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   
) 

Funkcja lib.auto instaluje od CRAN i BioConductor, jeśli jest to wymagane. The lib.auto.github instaluje się z GitHub.

Zastanawiam się nad przeniesieniem tego kodu do paczki.

3

Alternatywnie można użyć funkcji require. Spróbuje załadować pakiet i cicho zwrócić logiczną informację, czy pakiet jest dostępny. Istnieje również ostrzeżenie, jeśli pakiet nie może zostać załadowany.

test1 <- require("stats") 
test1 

test2 <- require("blah") 
test2 
Powiązane problemy