Многие ответы выше (и дубликаты этого вопроса) полагаются на 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)
}
}
}