Многие из перечисленных выше (и на дубликатах этого вопроса) ответы полагаться на installed.packages
который является плохой форме. Из документации:
Это может быть медленным, когда установлены тысячи пакетов, поэтому не используйте это, чтобы узнать, установлен ли именованный пакет (используйте файл system.file или find.package), а также не выясните, пакет можно использовать (вызвать запрос и проверить возвращаемое значение), а также не найти детали небольшого количества пакетов (используйте 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)
}
}
}
@krlmlr Как насчет принятого ответа устарел и требует пересмотра? Он работает для меня (для нескольких быстрых тестов) в разделе 'R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-разрядный)'. –
@BrianDiggs: Появилось по крайней мере три пакета, которые адресуют эту проблему, только один из них приведен ниже. Есть еще больше - вот в чем вопрос. – krlmlr
@krlmlr Кажется, что есть ироническая проблема с курицей и яйцом об использовании пакета для обеспечения (других) необходимых пакетов. Но, конечно, стоит того, чтобы кто-то, кто знает о них, написал ответ. –