Многие из приведенных выше ответов (и дубликатов этого вопроса) полагаются на то, installed.packages
что это дурной тон. Из документации:
Это может быть медленным, когда установлены тысячи пакетов, поэтому не используйте это, чтобы узнать, установлен ли названный пакет (используйте system.file или find.package), а также чтобы выяснить, можно ли использовать пакет (вызовите require и проверьте возвращаемое значение) ни для того, чтобы найти сведения о небольшом количестве пакетов (используйте packageDescription). Для каждого установленного пакета необходимо прочитать несколько файлов, что будет медленно в Windows и в некоторых сетевых файловых системах.
Таким образом, лучший подход - попытаться загрузить пакет с помощью require
и и установить, если загрузка не удалась ( require
вернется, FALSE
если он не найден). Я предпочитаю эту реализацию:
using<-function(...) {
libs<-unlist(list(...))
req<-unlist(lapply(libs,require,character.only=TRUE))
need<-libs[req==FALSE]
if(length(need)>0){
install.packages(need)
lapply(need,require,character.only=TRUE)
}
}
который можно использовать так:
using("RCurl","ggplot2","jsonlite","magrittr")
Таким образом, он загружает все пакеты, затем возвращается и устанавливает все отсутствующие пакеты (что, если хотите, является удобным местом для вставки подсказки с вопросом, хочет ли пользователь установить пакеты). Вместо того, чтобы вызывать install.packages
отдельно для каждого пакета, он пропускает весь вектор неустановленных пакетов только один раз.
Вот та же самая функция, но с диалоговым окном, которое спрашивает, хочет ли пользователь установить отсутствующие пакеты
using<-function(...) {
libs<-unlist(list(...))
req<-unlist(lapply(libs,require,character.only=TRUE))
need<-libs[req==FALSE]
n<-length(need)
if(n>0){
libsmsg<-if(n>2) paste(paste(need[1:(n-1)],collapse=", "),",",sep="") else need[1]
print(libsmsg)
if(n>1){
libsmsg<-paste(libsmsg," and ", need[n],sep="")
}
libsmsg<-paste("The following packages could not be found: ",libsmsg,"\n\r\n\rInstall missing packages?",collapse="")
if(winDialog(type = c("yesno"), libsmsg)=="YES"){
install.packages(need)
lapply(need,require,character.only=TRUE)
}
}
}
R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
.