Элегантный способ проверить отсутствующие пакеты и установить их?
Кажется, я делюсь большим количеством кода с соавторами в эти дни. Многие из них являются начинающими / промежуточными пользователями R и не понимают, что им нужно устанавливать пакеты, которых у них еще нет.
Есть ли элегантный способ позвонить installed.packages()
, сравните это с теми, которые я загружаю и устанавливаю, если отсутствует?
36 ответов
В моем случае я хотел один лайнер, который я мог запустить из командной строки (на самом деле через Makefile). Вот пример установки "VGAM" и "Перо", если они еще не установлены:
R -e 'for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")'
Изнутри R это будет просто:
for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")
Здесь нет ничего кроме предыдущих решений, кроме того, что:
- Я держу это в одной строке
- Я жестко закодировал
repos
параметр (чтобы избежать всплывающих окон, спрашивающих об использовании зеркала) - Я не пытаюсь определить функцию, которая будет использоваться в другом месте
Также обратите внимание на важные character.only=TRUE
(без этого require
попытался бы загрузить пакет p
).
library <- function(x){
x = toString(substitute(x))
if(!require(x,character.only=TRUE)){
install.packages(x)
base::library(x,character.only=TRUE)
}}
Это работает с именами пакетов без кавычек и довольно элегантно (см. Ответ GeoObserver)
pckg=c("shiny","ggplot2","dplyr","leaflet","lubridate","RColorBrewer","plotly","DT","shinythemes")
for(i in 1:length(pckg))
{
print(pckg[i])
if (!is.element(pckg[i], installed.packages()[,1]))
install.packages(pckg[i], dep = TRUE)
require(pckg[i], character.only = TRUE)
}
Стоя на плечах @MichaelChirico:
stopifnot(3 == length(find.package(c('foo', 'bar', 'baz'))))
packages_installed <- function(pkg_list){
pkgs <- unlist(pkg_list)
req <- unlist(lapply(pkgs, require, character.only = TRUE))
not_installed <- pkgs[req == FALSE]
lapply(not_installed, install.packages,
repos = "http://cran.r-project.org")# add lib.loc if needed
lapply(pkgs, library, character.only = TRUE)
}
Попробуй это:
if (!require(MyDesiredLibrary)) {
install.packages("MyDesiredLibrary")
}