2011-06-08 61 views
27

我想知道是否有使用install.packages()或其他相關功能做如下的方式:只下載指定的包的源(即tar.gz文件)及其所有的依賴到指定的文件夾(在Windows上)。只下載源和所有依賴

這樣做的一個原因是:假設我有一個Linux帳戶未啓用Internet訪問。爲了將Linux計算機上安裝的軟件包,我會先下載所有需要的資源我的Windows機器上,然後的FTP他們到Linux機器,並使用

install.packages('/home/me/R/Packages/blah.tar.gz', repos = NULL) 

回答

13

現在有在工具包自帶的基礎R這個更好的選擇:package_dependencies()。例如,參見@ sebastian-c的回答以及相關用例的recent Q&A


有一個在utils包的未導出getDependencies()功能。我還沒有研究它是如何工作的,但是將它與@Dirk的答案結合起來應該能讓你獲得最大的成功。

基本上不過,看來你使用它像:

utils:::getDependencies(pkgs, dependencies, available, lib) 

其中pkgs是包的特徵向量來安裝,dependencies是你想要類型的依賴關係(取決於提高等)的字符向量,availableavailable.packages()的輸出,lib是評估依賴關係的包的庫位置。

如果調試install.packages()它基本上是做getDependencies()步然後@德克的download.packages()一步,它實際上開始安裝任何東西之前。

+0

+1謝謝! - 我正在調整utils ::: getDependencies'來讓我得到依賴包的列表並忽略我已經安裝的東西。這加上'download.packages'應該這樣做。 – 2011-06-08 16:31:48

+0

@Prasad是不是'getDependencies()'做了什麼 - 至少對我來說,它只列出了我還沒有安裝在'lib'中的軟件包? – 2011-06-08 18:06:29

+0

正確的,但要記住我已經安裝了我贏的機器上的一切,我試圖讓依賴的包的列表中現有的包,這樣我可以得到他們的來源,ftp到Linux機器,並安裝有。一旦我將所有'tar.gz'文件ftp到Linux機器上,我就會使用'install.packages('blah.tar.gz',...)'按照適當的順序安裝它們,以便一切正常。 – 2011-06-08 18:28:06

16

嘗試download.packages(c("xts", "rms"), "c:/TEMP", .....) Linux機器上安裝它們而不是install.packages();你可以直接在第二個參數中給它一個目標目錄。

幾年後編輯:如上所述,在其他答案和評論中,現在有幾個輔助函數已被添加到R的工具和utils包中。 R 3.4.0將有tools::CRAN_package_db()下載頂級PACKAGES.rds文件(當然,您也可以結合使用download.file()readRDS())。

+0

這就是我的想法,但你如何選擇依賴? – 2011-06-08 15:36:19

+1

可能「手動」使用'read.dcf()'和朋友來解析控制文件(你直接打了折CRAN,例如這是小紅莓做什麼)。哦,'cran2deb'將會有邏輯,因爲它甚至會首先建立依賴關係。 – 2011-06-08 15:39:14

+0

我希望,因爲'install.packages'自動地發現所有的依賴關係,會有一些辦法以某種方式關閉「安裝」階段,使我們擁有一套正確的下載文件。 – 2011-06-08 15:42:46

29

最近,我有,我想下載所有的依賴問題,我已經這樣解決了它:

說我想所有的依賴和ggplot2進口MASS

getPackages <- function(packs){ 
    packages <- unlist(
    tools::package_dependencies(packs, available.packages(), 
         which=c("Depends", "Imports"), recursive=TRUE) 
) 
    packages <- union(packs, packages) 
    packages 
} 

packages <- getPackages(c("ggplot2", "MASS")) 

我可以現在將軟件包下載到另一個目錄。

download.packages(packages, destdir="whereyouactuallywantthefiles", 
        type="source") 

從那裏,如果你想使一個本地回購你的Linux PC上,按照說明here