Parece que estou compartilhando muito código com os co-autores atualmente. Muitos deles são usuários R iniciantes / intermediários e não percebem que precisam instalar pacotes que ainda não possuem.
Existe uma maneira elegante de ligar installed.packages()
, comparar com as que estou carregando e instalando, se estiver faltando?
R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
.base
... ;-)Respostas:
Sim. Se você possui sua lista de pacotes, compare-a com a saída
installed.packages()[,"Package"]
e instale os pacotes ausentes. Algo assim:De outra forma:
Se você colocar seu código em um pacote e torná-lo dependente, ele será instalado automaticamente quando você instalar o pacote.
fonte
if(length(new.packages)>0) {install.packages(new.packages)}
new.packages <- c(1,2)
length(new.packages)
if(length(new.packages)){print("hello!")}else{print("oh no!")}
require
em vez de verificarinstalled.packages
packrat
foi feito para isso. É um sistema de gerenciamento de pacotes reproduzível. Dessa maneira, o processo é errado e mexe com o ambiente de outra pessoa e não é reproduzível. O Packrat possui sua própria pasta e ambiente para as bibliotecas compartilhadas. rstudio.github.io/packratDason K. e eu temos o pacote pacman que pode fazer isso muito bem. A função
p_load
no pacote faz isso. A primeira linha é apenas para garantir que o pacman esteja instalado.fonte
/
e, se encontrado, instalasse / carregasse no github automaticamente.if (!require("pacman")) install.packages("pacman")
existe uma função no pacman chamadap_boot()
que faz essa linha automaticamente e copia para a área de transferência.Você pode apenas usar o valor de retorno de
require
:Eu uso
library
após a instalação, porque ela emitirá uma exceção se a instalação não tiver sido bem-sucedida ou se o pacote não puder ser carregado por algum outro motivo. Você torna isso mais robusto e reutilizável:A desvantagem desse método é que você deve passar o nome do pacote entre aspas, o que você não faz de verdade
require
.fonte
character.only = TRUE
nosrequire
, mas então eu acho que não há nada para diferenciar a sua resposta da minha."ggplot2" é o pacote. Ele verifica se o pacote está instalado, se não está. Em seguida, ele carrega o pacote independentemente de qual ramificação foi realizada.
fonte
Essa solução pega um vetor de caracteres dos nomes dos pacotes e tenta carregá-los ou instalá-los se o carregamento falhar. Ele se baseia no comportamento de retorno de
require
fazer isso porque ...Portanto, podemos simplesmente ver se conseguimos carregar o pacote necessário e, se não, instalá-lo com dependências. Então, dado um vetor de caractere de pacotes que você deseja carregar ...
fonte
require
novamente após a instalação?if
declaração seja avaliada, ela deve primeiro avaliarrequire
, cujo efeito colateral é carregar o pacote, se estiver disponível!install.packages
, pois isso não carregaria realmente esse pacote. Mas (para @krlmlr) suspeito que a intenção é que esse fragmento de código seja chamado apenas uma vez; você não escreveria isso toda vez que exigisse o pacote. Em vez disso, você deve executá-lo uma vez antes do tempo e depois ligarrequire
como de costume, conforme necessário.require
uma ligação para o segundo paralibrary
que ele falhe ruidosamente se ainda não conseguir anexar o pacote por algum motivo?Muitas das respostas acima (e duplicatas desta pergunta) dependem da
installed.packages
má forma. A partir da documentação:Portanto, uma abordagem melhor é tentar carregar o pacote usando ee
require
instalando se o carregamento falhar (require
retornaráFALSE
se não for encontrado). Eu prefiro esta implementação:que pode ser usado assim:
Dessa forma, ele carrega todos os pacotes, depois volta e instala todos os pacotes ausentes (que, se você quiser, é um local útil para inserir um prompt para perguntar se o usuário deseja instalar pacotes). Em vez de chamar
install.packages
separadamente para cada pacote, ele passa o vetor inteiro de pacotes desinstalados apenas uma vez.Aqui está a mesma função, mas com uma caixa de diálogo do Windows que pergunta se o usuário deseja instalar os pacotes ausentes
fonte
Embora a resposta de Shane seja realmente boa, para um dos meus projetos eu precisava remover as mensagens de saída, avisos e instalar pacotes automaticamente . Finalmente consegui obter este script:
Usar:
fonte
fonte
Este é o objetivo do pacote rbundler : fornecer uma maneira de controlar os pacotes instalados para um projeto específico. No momento, o pacote trabalha com a funcionalidade devtools para instalar pacotes no diretório do seu projeto. A funcionalidade é semelhante ao empacotador de Ruby .
Se o seu projeto é um pacote (recomendado), tudo o que você precisa fazer é carregar o rbundler e empacotar os pacotes. A
bundle
função examinará oDESCRIPTION
arquivo do seu pacote para determinar quais pacotes agrupar.Agora os pacotes serão instalados no diretório .Rbundle.
Se o seu projeto não é um pacote, você pode falsificá-lo criando um
DESCRIPTION
arquivo no diretório raiz do seu projeto com um campo Depends que lista os pacotes que você deseja instalar (com informações opcionais da versão):Aqui está o repositório do github para o projeto, se você estiver interessado em contribuir: rbundler .
fonte
Certo.
Você precisa comparar 'pacotes instalados' com 'pacotes desejados'. Isso é muito parecido com o que eu faço com o CRANberries, pois preciso comparar 'pacotes conhecidos armazenados' com 'pacotes atualmente conhecidos' para determinar pacotes novos e / ou atualizados.
Então faça algo como
Para obter todos os pacotes conhecidos, chame os pacotes atualmente instalados e compare-os a um determinado conjunto de pacotes de destino.
fonte
Use
packrat
para que as bibliotecas compartilhadas sejam exatamente iguais e não alterem o ambiente de outras pessoas.Em termos de elegância e melhores práticas, acho que você está fundamentalmente fazendo isso da maneira errada. O pacote
packrat
foi projetado para esses problemas. É desenvolvido pelo RStudio por Hadley Wickham. Em vez de terem que instalar dependências e possivelmente atrapalhar o sistema de ambiente de alguém,packrat
usa seu próprio diretório e instala todas as dependências dos seus programas lá e não toca no ambiente de alguém.https://rstudio.github.io/packrat/
fonte
A seguinte função simples funciona como um encanto:
(não o meu, encontrei isso na web há algum tempo e o estava usando desde então. não tenho certeza da fonte original)
fonte
Eu uso a seguinte função para instalar o pacote se
require("<package>")
sair com o erro do pacote não encontrado. Ele consultará os repositórios - CRAN e Bioconductor quanto a pacotes ausentes.Adaptado do trabalho original de Joshua Wiley, http://r.789695.n4.nabble.com/Install-package-automatically-if-not-there-td2267532.html
Exemplo:
PS:
update.packages(ask = FALSE)
&biocLite(character(), ask=FALSE)
atualizará todos os pacotes instalados no sistema. Isso pode levar um longo tempo e considerá-lo uma atualização completa do R, que pode não ser garantida o tempo todo!fonte
loadpack()
em raw.githubusercontent.com/holgerbrandl/datautils/master/R/…Você pode simplesmente usar a
setdiff
função para obter os pacotes que não estão instalados e depois instalá-los. Na amostra abaixo, verificamos se os pacotesggplot2
eRcpp
estão instalados antes de instalá-los.Em uma linha, o acima pode ser escrito como:
fonte
installed.packages()[,'Package']
vez derownames(installed.packages())
.Eu implementei a função para instalar e carregar pacotes R necessários silenciosamente. A esperança pode ajudar. Aqui está o código:
fonte
A próxima versão do RStudio (1.2), já disponível como uma prévia, incluirá um recurso para detectar pacotes
library()
erequire()
chamadas ausentes e solicitar ao usuário que os instale:Isso parece abordar a preocupação original do OP particularmente bem:
fonte
Em relação ao seu principal objetivo "instalar bibliotecas que elas ainda não possuem" e independentemente de usar "instllaed.packages ()". A função a seguir mascara a função original de require. Ele tenta carregar e verificar o pacote nomeado "x", se não estiver instalado, instale-o diretamente, incluindo dependências; e, finalmente, carregá-lo normalmente. você renomeia o nome da função de 'require' para 'library' para manter a integridade. A única limitação é que os nomes dos pacotes devem ser citados.
Portanto, você pode carregar e instalar o pacote da maneira antiga de R. require ("ggplot2") require ("Rcpp")
fonte
delete
link acima desses comentários. Caso contrário, e você ainda deseja excluir, use oflag
link, selecione "outro" e explique a um moderador que deseja remover a resposta.Bastante básico.
fonte
Pensei em contribuir com o que eu uso:
fonte
fonte
Usando a família lapply e a abordagem de função anônima, você pode:
||
avaliação lenta).Imprima o status de carregamento final de cada pacote (
TRUE
/FALSE
).fonte
Eu uso o seguinte, que verificará se o pacote está instalado e se as dependências foram atualizadas e, em seguida, carrega o pacote.
fonte
Aqui está o meu código:
fonte
fonte
Isso funciona com nomes de pacotes não citados e é bastante elegante (consulte a resposta do GeoObserver)
fonte
No meu caso, eu queria um liner que pudesse ser executado a partir da linha de comando (na verdade, através de um Makefile). Aqui está um exemplo de instalação de "VGAM" e "feather" se eles ainda não estiverem instalados:
De dentro de R seria apenas:
Não há nada aqui além das soluções anteriores, exceto que:
repos
parâmetro (para evitar pop-ups perguntando sobre o espelho para usar)Observe também o importante
character.only=TRUE
(sem ele, orequire
tentaria carregar o pacotep
).fonte
fonte
Deixe-me compartilhar um pouco de loucura:
fonte