2015-09-06 41 views
1

我是R新手,我已經花了一段時間在Web上的腳本示例,我碰到一個腳本,有一堆require(<package>)行。而不是寫install.packages(<package>),我修改劇本這樣:R控制檯與R腳本環境的區別;錯誤與installed.packages()

package_names <- c('caret', 
       'readr', 
       'xgboost', 
       'ggplot2', 
       'R.utils', 
       'gridExtra', 
       'lubridate', 
       'data.table', 
       'Matrix', 
       'plyr', 
       'Hmisc', 
       'maps', 
       'maptools', 
       'sp', 
       'corrplot') 
for (package_name in package_names){ 
    if (!package_name %in% rownames(installed.packages())) 
     install.packages(package_name) 

    eval(parse(text=sprintf("require(%s)",package_name))) 
} 

因此,它會試圖安裝的軟件包,如果沒有安裝它,需要它。但是在執行此爲腳本,導致下面的誤差R演播室:

Error in contrib.url(repos, "source") : 
    trying to use CRAN without setting a mirror 
Calls: <Anonymous> ... withVisible -> eval -> eval -> install.packages -> contrib.url 

我不顯式調用contrib.url所以我真的不知道從哪裏開始。

但是我試着複製粘貼這些確切的行,並在命令行R Studio解釋器會話(repl)中運行它們,然後運行並完美地安裝/更新所有這些軟件包。

這引出了一個問題:命令行會話和導致此錯誤的腳本有什麼區別?

+0

你是如何運行腳本的? –

+0

我相信** pacman **包的'p_load'函數會爲您處理所有這些,包括cran回購集。它會使代碼更加簡潔和可讀。 –

+2

順便說一下,通過使用'install.packages(setdiff(package_names,rownames(installed.packages())))'而不是循環,可以將代碼製作成兩行更具慣用的R代碼。要用變量調用'require'(更好:'library' - 不需要'require'!),使用'require(var,character.only = TRUE)'。你可以使用'invisible(Map(library,package_names,character.only = TRUE))'一次完成所有的包。兩個陳述。 –

回答

4

設置CRAN鏡腳本,由getCRANmirror()返回的選項,例如當中,

chooseCRANmirror(ind=1) 

正如@KonradRudolph建議,更習慣的方法可能是安裝任何遺漏的需求,然後require()所有包。

chooseCRANmirror(ind=1) 
needed = package_names[!package_names %in% rownames(installed.packages())] 
install.packages(needed) 
ok = sapply(package_names, require, character.only=TRUE) 
if (!all(ok)) { 
    bad = paste(package_names[!ok], collapse=", ") 
    stop("failed to 'require' packages: ", bad) 
}