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.
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
@Andrie Scheint wie eine vernünftige Sache in einer Antwort zu posten – Dason
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"? –