2015-03-05 6 views
11

Ich habe die Quelldateien für eine Reihe von Paketen und deren Abhängigkeiten, die ich auf Computern installieren möchte, die keinen Internetzugang haben. Ich möchte alle diese auf anderen Computern als USB-Stick installieren, aber die Installation schlägt für einige Pakete fehl, da die Abhängigkeiten nicht vor den Paketen installiert werden. Wie kann ich die Abhängigkeiten in der Reihenfolge vor den Paketen, die sie benötigen, installieren?Offline-Installation einer Liste von Paketen: Abrufen von Abhängigkeiten

Hier ist meine aktuelle Methode, die Pakete zu erhalten, deren Abhängigkeiten, und sie in der richtigen Reihenfolge erhalten:

# find the dependencies for the packages I want 
# from http://stackoverflow.com/a/15650828/1036500 
getPackages <- function(packs){ 
    packages <- unlist(
    tools::package_dependencies(packs, available.packages(), 
           which=c("Depends", "Imports"), recursive=TRUE) 
) 
    packages <- union(packages, packs) 
    packages 
} 

# packages I want 
my_packages <- c('stringr', 'devtools', 'ggplot2', 'dplyr', 'tidyr', 'rmarkdown', 'knitr', 'reshape2', 'gdata') 

# get names of dependencies and try to get them in the right order, this seems ridiculous... 
my_packages_and_dependencies <- getPackages(my_packages) 
dependencies_only <- setdiff(my_packages_and_dependencies, my_packages) 
deps_of_deps <- getPackages(dependencies_only) 
deps_of_deps_of_deps <- getPackages(deps_of_deps) 
my_packages_and_dependencies <- unique(c(deps_of_deps_of_deps, deps_of_deps, dependencies_only, my_packages)) 

# where to keep the source? 
local_CRAN <- paste0(getwd(), "/local_CRAN") 

# get them from CRAN, source files 
download.packages(pkgs = my_packages_and_dependencies, destdir = local_CRAN, type = "source") 
# note that 'tools', 'methods', 'utils, 'stats', etc. art not on CRAN, but are part of base 

# from http://stackoverflow.com/a/10841614/1036500 
library(tools) 
write_PACKAGES(local_CRAN) 

Jetzt nehme ich auf einem anderen Computer bin mit einem frischen R installieren und RStudio (und RTools oder Xcode) und keine Internet-Verbindung, die ich in den USB-Stick einstecken, öffnen Sie die RProj Datei das Arbeitsverzeichnis zu setzen und dieses Skript ausführen:

############################################################# 

## Install from source (Windows/OSX/Linux) 

# What do I want to install? 
my_packages_and_dependencies <- c("methods", "tools", "bitops", "stats", "colorspace", "graphics", 
            "tcltk", "Rcpp", "digest", "jsonlite", "mime", "RCurl", "R6", 
            "stringr", "brew", "grid", "RColorBrewer", "dichromat", "munsell", 
            "plyr", "labeling", "grDevices", "utils", "httr", "memoise", 
            "whisker", "evaluate", "rstudioapi", "roxygen2", "gtable", "scales", 
            "proto", "MASS", "assertthat", "magrittr", "lazyeval", "DBI", 
            "stringi", "yaml", "htmltools", "caTools", "formatR", "highr", 
            "markdown", "gtools", "devtools", "ggplot2", "dplyr", "tidyr", 
            "rmarkdown", "knitr", "reshape2", "gdata") 

# where are the source files? 
local_CRAN <- paste0(getwd(), "/local_CRAN") 

# scan all packages and get files names of wanted source pckgs 
# I've got other things in this dir also 
wanted_package_source_filenames <- list.files(local_CRAN, pattern = "tar.gz", full.names = TRUE) 

# put them in order to make sure deps go first, room for improvement here... 
trims <- c(local_CRAN, "/", "tar.gz") 
x1 <- gsub(paste(trims, collapse = "|"), "", wanted_package_source_filenames) 
x2 <- sapply(strsplit(x1, "_"), "[[", 1) 
idx <- match(my_packages_and_dependencies, x2) 
wanted_package_source_filenames <- na.omit(wanted_package_source_filenames[idx]) 

install.packages(wanted_package_source_filenames, 
       repos = NULL, 
       dependencies = TRUE, 
       contrib.url = local_CRAN, # I thought this would take care of getting dependencies automatically... 
       type = "source") 

dieses recht gut funktioniert, aber immer noch einige Pakete lassen sich nicht installieren:

sapply(my_packages_and_dependencies, require, character.only = TRUE) 

methods  tools  bitops  stats 
     TRUE   TRUE   TRUE   TRUE 
    colorspace  graphics  tcltk   Rcpp 
     TRUE   TRUE   TRUE   TRUE 
     digest  jsonlite   mime  RCurl 
     TRUE   TRUE   TRUE  FALSE 
      R6  stringr   brew   grid 
     TRUE   TRUE   TRUE   TRUE 
RColorBrewer dichromat  munsell   plyr 
     TRUE   TRUE   TRUE   TRUE 
    labeling grDevices  utils   httr 
     TRUE   TRUE   TRUE  FALSE 
    memoise  whisker  evaluate rstudioapi 
     TRUE   TRUE   TRUE   TRUE 
    roxygen2  gtable  scales  proto 
     TRUE   TRUE   TRUE   TRUE 
     MASS assertthat  magrittr  lazyeval 
     TRUE   TRUE   TRUE   TRUE 
     DBI  stringi   yaml htmltools 
     TRUE   TRUE   TRUE   TRUE 
    caTools  formatR  highr  markdown 
     TRUE   TRUE   TRUE   TRUE 
     gtools  devtools  ggplot2  dplyr 
     TRUE  FALSE  FALSE   TRUE 
     tidyr rmarkdown  knitr  reshape2 
     FALSE  FALSE   TRUE   TRUE 
     gdata 
     TRUE 
Warning messages: 
1: In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : 
    there is no package called ‘RCurl’ 
2: In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : 
    there is no package called ‘httr’ 
3: In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : 
    there is no package called ‘devtools’ 
4: In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : 
    there is no package called ‘ggplot2’ 
5: In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : 
    there is no package called ‘tidyr’ 
6: In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : 
    there is no package called ‘rmarkdown’ 

Es scheint, dass knitr vor rmarkdown kommen muß, reshape2 vor tidyr und ggplot2, etc. etc.

Es muss eine einfachere und vollständige Lösung für das Problem des Erhaltens der Liste der Quelldateien im sehr sein spezifische Reihenfolge benötigt, die alle Abhängigkeiten in die richtige Reihenfolge bringen. Was ist der einfachste Weg, dies zu tun (ohne irgendwelche beigetragenen Pakete zu verwenden)?

Dies ist das System, das ich aktuell arbeite, ich bin die Quelle Versionen von Paketen in einem Versuch für alles, was mit dem Offline-Rechner (OSX/Linux/Windows) vorzubereiten:

> sessionInfo() 
R version 3.1.2 (2014-10-31) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] tcltk  grid  tools  stats  graphics 
[6] grDevices utils  datasets methods base  

other attached packages: 
[1] gdata_2.13.3  reshape2_1.4.1  
[3] knitr_1.9   dplyr_0.4.1  
[5] gtools_3.4.1  markdown_0.7.4  
[7] highr_0.4   formatR_1.0  
[9] caTools_1.17.1  htmltools_0.2.6 
[11] yaml_2.1.13  stringi_0.4-1  
[13] DBI_0.3.1   lazyeval_0.1.10 
[15] magrittr_1.5  assertthat_0.1  
[17] proto_0.3-10  scales_0.2.4  
[19] gtable_0.1.2  roxygen2_4.1.0  
[21] rstudioapi_0.2  evaluate_0.5.5  
[23] whisker_0.3-2  memoise_0.2.1  
[25] labeling_0.3  plyr_1.8.1   
[27] munsell_0.4.2  dichromat_2.0-0 
[29] RColorBrewer_1.1-2 brew_1.0-6   
[31] stringr_0.6.2  R6_2.0.1   
[33] mime_0.2   jsonlite_0.9.14 
[35] digest_0.6.8  Rcpp_0.11.4  
[37] colorspace_1.2-5 bitops_1.0-6  
[39] MASS_7.3-35  

loaded via a namespace (and not attached): 
[1] parallel_3.1.2 

EDIT nach Andries hilfreicher Kommentar, ich habe mit MiniCRAN versucht, das Bit, das von der Vignette fehlt, ist, wie Sie die Pakete aus dem lokalen Repo tatsächlich installieren. Dies ist, was ich versucht habe:

library("miniCRAN") 

# Specify list of packages to download 
pkgs <- c('stringr', 'devtools', 'ggplot2', 'dplyr', 'tidyr', 'rmarkdown', 'knitr', 'reshape2', 'gdata') 

# Make list of package URLs 
revolution <- c(CRAN="http://cran.revolutionanalytics.com") 
pkgList <- pkgDep(pkgs, repos=revolution, type="source") 
pkgList 

# Set location to store source files 
local_CRAN <- paste0(getwd(), "/local_CRAN") 

# Make repo for source 
makeRepo(pkgList, path = local_CRAN, repos = revolution, type = "source") 

# install... 
install.packages(pkgs, 
       repos = local_CRAN, # do I really need "file:///"? 
       dependencies = TRUE, 
       contrib.url = local_CRAN, 
       type = "source") 

Und das Ergebnis ist:

Installing packages into ‘C:/emacs/R/win-library/3.1’ 
(as ‘lib’ is unspecified) 
Warning in install.packages : 
    unable to access index for repository C:/Users/.../local_CRAN/src/contrib 
Warning in install.packages : 
    packages ‘stringr’, ‘devtools’, ‘ggplot2’, ‘dplyr’, ‘tidyr’, ‘rmarkdown’, ‘knitr’, ‘reshape2’, ‘gdata’ are not available (for R version 3.1.2) 

Was soll ich hier fehlt?

EDIT Ja, ich fehlte die ordnungsgemäße Verwendung von file:///, die wie folgt sein sollte:

install.packages(pkgs, 
       repos = paste0("file:///", local_CRAN), 
       type = "source") 

Das hat mich entlang Haufen bewegt hat, es ist alles im Grunde funktioniert nun wie erwartet. Vielen Dank. Jetzt habe ich nur das zu sehen in: fatal error: curl/curl.h: No such file or directory, die RCurl und HTR von der Installation zu stoppen.

+3

Mein Paket 'miniCRAN' kann dabei helfen. Sie sagen 'miniCRAN' die Liste der Pakete, die Sie jemals installieren möchten, dann lädt sie diese Pakete herunter und erstellt ein Repository auf Ihrem lokalen Rechner, das sich wie CRAN verhält, dh es beachtet' install.packages() 'usw. Siehe http://cran.r-project.org/web/packages/miniCRAN/index.html – Andrie

+0

@Andrie Scheint wie eine vernünftige Sache in einer Antwort zu posten – Dason

+1

Könnten Sie Schleife über die Dateien BESCHREIBUNG, Zählen der Anzahl der Abhängigkeiten? Dann installieren Sie zuerst alle Pakete ohne Abhängigkeiten, diejenigen mit nur einer Abhängigkeits-Sekunde (sortieren Sie irgendwie nach, ob ihre Namen in der Liste irgendwelcher anderer einzelner Abhängigkeits-Pakete waren) und so weiter "auf der ganzen Linie"? –

Antwort

12

Das Paket miniCRAN kann dabei helfen. Sie geben miniCRAN die Liste der Pakete an, die Sie jemals installieren möchten, dann ermittelt es die Abhängigkeiten, lädt diese Pakete herunter und erstellt ein Repository auf Ihrem lokalen Rechner, das sich wie CRAN verhält, d.h. es berücksichtigt install.packages() usw.

Weitere Informationen:

Um aus den lokalen miniCRAN Repository zu installieren, haben Sie zwei Möglichkeiten.

  1. Zunächst können Sie die URI-Konvention file:/// verwenden. z.B.

    install.packages("ggplot2", repos="file:///path/to/file/") 
    
  2. Alternativ können Sie das Ziel als ein HTTP-Server konfigurieren und das Repository über eine URL zur Verfügung stellen. In diesem Fall sieht und fühlt sich Ihr lokales Repository genau wie ein CRAN-Spiegel an, außer dass es nur Ihre gewünschten Pakete enthält.

+0

Vielen Dank, das sieht sehr relevant aus. Ich habe damit angefangen und bin ein bisschen hängengeblieben. Würde es dir etwas ausmachen, meine Bearbeitung meiner Q zu überprüfen? – Ben

+0

@Ben Ich habe meine Antwort bearbeitet – Andrie

+0

Danke nochmal, das ist ziemlich gut das Problem gelöst. Nur ein RCurl Puzzle zu lösen, aber das ist eine andere Frage ... – Ben