Елегантний спосіб перевірити відсутні пакети та встановити їх?


336

Я, здається, цими днями ділиться великим кодом з співавторами. Багато з них є початківцями / проміжними користувачами R і не розуміють, що їм доведеться встановлювати пакети, яких у них ще немає.

Чи є елегантний спосіб зателефонувати installed.packages(), порівняти його з тими, які я завантажую та встановлюю, якщо таких немає?


1
@krlmlr Що щодо прийнятої відповіді застаріло і потребує перегляду? Це працює для мене (для кількох швидких тестів) під R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit).
Брайан Діггс

1
@BrianDiggs: З'явилося щонайменше три пакети, які вирішують цю проблему, лише на один посилається нижче. Чи є ще більше - ось питання.
krlmlr

2
@krlmlr Мабуть, є певна іронічна проблема з курячим яйцем щодо використання пакету, щоб забезпечити (інші) необхідні пакети. Але, безумовно, варто, щоб хтось, хто знає про них, написати відповідь.
Брайан Діггс

2
@BrianDiggs: Завантаження цього пакета для перевірки встановлення - це неприємність, але невелика. Якщо, звичайно, функціональність не знайде свого шляху до base... ;-)
krlmlr

Відповіді:


304

Так. Якщо у вас є список пакунків, порівняйте його з результатами installed.packages()[,"Package"]та встановіть відсутні пакети. Щось на зразок цього:

list.of.packages <- c("ggplot2", "Rcpp")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

Інакше:

Якщо ви помістите свій код в пакет і зробите їх залежними, вони автоматично встановляться при встановленні вашого пакету.


11
Я думаю, що правильний синтаксис такий: if(length(new.packages)>0) {install.packages(new.packages)}

5
@psql, Shine має рацію, оскільки "> 0" є "неявною" в умові if. запустіть це, щоб перевірити це:new.packages <- c(1,2) length(new.packages) if(length(new.packages)){print("hello!")}else{print("oh no!")}
Андреа Cirillo

7
Документ install.packages зазначає: "Це може бути повільним, коли встановлено тисячі пакетів, тому не використовуйте це, щоб дізнатися, чи встановлений іменований пакет (використовуйте system.file або find.package) ..."
Томас Матерна

2
Погодьтеся з Томасом, це буде кращою ефективністю, requireа не перевіркаinstalled.packages
Меттью

1
packratдля цього було зроблено. Це відтворювана система управління пакетами. Цей шлях іде про це неправильним шляхом і поспішає з чужим оточенням і не відтворюється. Packrat має власну папку та середовище для спільних бібліотек. rstudio.github.io/packrat
mtelesha

231

Dason К. і у мене є pacman пакет , який може зробити це красиво. Функція p_loadв пакеті робить це. Перший рядок полягає лише в тому, щоб встановити Pacman.

if (!require("pacman")) install.packages("pacman")
pacman::p_load(package1, package2, package_n)

1
Який статус пакету? Я не можу побачити на C-RAN.
MERose


6
Встановили зараз і чудово працює; має бути частиною бази!
AndyF

3
Єдиним способом цього було б краще, якби він перевірив /і, якщо він знайдеться, встановити / завантажити автоматично з github.
авіанапад

4
@NealBarsch, якщо ви маєте на увазі, що if (!require("pacman")) install.packages("pacman")в Pacman є функція, яка називає p_boot()цей maks цей рядок для вас автоматично і копіює його в буфер обміну.
Тайлер Рінкер

72

Ви можете просто використовувати повернене значення require:

if(!require(somepackage)){
    install.packages("somepackage")
    library(somepackage)
}

Я використовую libraryпісля встановлення, оскільки він викине виняток, якщо встановлення не вдалося або пакет не вдасться завантажити з якоїсь іншої причини. Ви робите це більш надійним і багаторазовим:

dynamic_require <- function(package){
  if(eval(parse(text=paste("require(",package,")")))) return True

  install.packages(package)
  return eval(parse(text=paste("require(",package,")")))
}

Мінусом цього методу є те, що вам потрібно передати назву пакета в лапках, що ви не робите для справжнього require.


4
Ви можете спростити ваше життя багато, використовуючи character.only = TRUEв require, але я припускаю , що немає нічого , щоб диференціювати свою відповідь від мого.
Саймон О'Ханлон

Це виглядає приємно, але це, здається, не працює, принаймні для мене. Коли я спробував надійну версію цього, я отримую два повідомлення про помилку, оскільки R чомусь не знає, як поводитися з "return True" і "return eval". Тому я дуже хотів би функцію, подібну цій, яка завантажує пакет, якщо він присутній у моїй бібліотеці, і іншим чином встановлює (а потім завантажує) пакет. В ідеалі я б використовував це як за замовчуванням для завантаження пакетів. Принаймні, здається, це було б сенсом зробити це і заощадило б трохи часу.
Фабіан

23
if (!require('ggplot2')) install.packages('ggplot2'); library('ggplot2')

"ggplot2" - пакет. Він перевіряє, чи встановлений пакет, чи не він його встановлює. Потім він завантажує пакет незалежно від того, яку галузь він взяв.


21

Це рішення займе символьний вектор імен пакунків і спробує завантажити їх або встановити їх, якщо завантаження не вдалося. Він покладається на зворотну поведінку, requireщоб зробити це, тому що ...

require повертає (невидимо) логічне вказівку, чи є необхідний пакет доступним

Тому ми можемо просто побачити, чи змогли ми завантажити необхідний пакет, а якщо ні, встановити його залежно. Отже, заданий векторний символ пакетів, які ви хочете завантажити ...

foo <- function(x){
  for( i in x ){
    #  require returns TRUE invisibly if it was able to load package
    if( ! require( i , character.only = TRUE ) ){
      #  If package was not able to be loaded then re-install
      install.packages( i , dependencies = TRUE )
      #  Load package after installing
      require( i , character.only = TRUE )
    }
  }
}

#  Then try/install packages...
foo( c("ggplot2" , "reshape2" , "data.table" ) )

Не хочете requireзнову зателефонувати після встановлення?
krlmlr

@krlmlr Ні, тому що для того, ifщоб оцінювати твердження, його слід спочатку оцінити require, побічним ефектом якого є завантаження пакета, якщо він доступний!
Simon O'Hanlon

1
SimonO101: Я думаю, що krlmlr означає в операторі if після дзвінка до install.packages, оскільки це фактично не завантажує цей пакет. Але (до @krlmlr) я підозрюю, що цей фрагмент коду буде викликаний лише один раз; ви б не писали цього щоразу, коли вимагали пакет. Замість цього ви запустили його один раз достроково, а потім зателефонували requireяк завжди.
Аарон залишив стек переповнення

@Aaron ах так добре, я бачу, що ви маєте на увазі, і так, ваше тлумачення правильне. Я трохи відредагую його, щоб бути більш чітким щодо завантаження після встановлення.
Simon O'Hanlon

1
хіба не було б краще здійснити другий requireдзвінок, щоб libraryвін не вдавався шумно, якщо він ще не може приєднати пакет з якоїсь причини?
кабдула

18

Дуже багато відповідей вище (і на дублікати цього питання) покладаються на те, 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окремо для кожного пакету він передає весь вектор видалених пакетів лише один раз.

Ось така ж функція, але з діалоговим вікном Windows, яке запитує, чи хоче користувач встановити відсутні пакети

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)
        }
    }
}

Це досить елегантний спосіб, набагато кращий, ніж прийнятий. Я включу його до моєї особистої бібліотеки. Дякую.
Бінг

15

Хоча відповідь Шейна справді хороша, для одного з моїх проектів мені потрібно було видалити повідомлення про вихід, попередження та встановити пакети автоматично . Нарешті мені вдалося отримати цей сценарій:

InstalledPackage <- function(package) 
{
    available <- suppressMessages(suppressWarnings(sapply(package, require, quietly = TRUE, character.only = TRUE, warn.conflicts = FALSE)))
    missing <- package[!available]
    if (length(missing) > 0) return(FALSE)
    return(TRUE)
}

CRANChoosen <- function()
{
    return(getOption("repos")["CRAN"] != "@CRAN@")
}

UsePackage <- function(package, defaultCRANmirror = "http://cran.at.r-project.org") 
{
    if(!InstalledPackage(package))
    {
        if(!CRANChoosen())
        {       
            chooseCRANmirror()
            if(!CRANChoosen())
            {
                options(repos = c(CRAN = defaultCRANmirror))
            }
        }

        suppressMessages(suppressWarnings(install.packages(package)))
        if(!InstalledPackage(package)) return(FALSE)
    }
    return(TRUE)
}

Використання:

libraries <- c("ReadImages", "ggplot2")
for(library in libraries) 
{ 
    if(!UsePackage(library))
    {
        stop("Error!", library)
    }
}

9
# List of packages for session
.packages = c("ggplot2", "plyr", "rms")

# Install CRAN packages (if not already installed)
.inst <- .packages %in% installed.packages()
if(length(.packages[!.inst]) > 0) install.packages(.packages[!.inst])

# Load packages into session 
lapply(.packages, require, character.only=TRUE)

6

Це мета пакету rbundler : забезпечити спосіб управління пакетами, встановленими для конкретного проекту. Зараз пакет працює з функцією devtools для встановлення пакетів у каталог вашого проекту. Функціонал аналогічний постачальнику Ruby .

Якщо ваш проект - це пакет (рекомендований), тоді все, що вам потрібно зробити, це завантажити rbundler і зв’язати пакунки. bundleФункція буде виглядати в вашому пакеті DESCRIPTIONфайл , щоб визначити , які пакети для об'єднання.

library(rbundler)
bundle('.', repos="http://cran.us.r-project.org")

Тепер пакети будуть встановлені в каталозі .Rbundle.

Якщо ваш проект не є пакетом, ви можете підробити його, створивши DESCRIPTIONфайл у кореневій папці вашого проекту із полем залежно, в якому перераховані пакети, які ви хочете встановити (з додатковою інформацією про версію):

Depends: ggplot2 (>= 0.9.2), arm, glmnet

Ось github repo для проекту, якщо вам цікаво внести участь: rbundler .


5

Звичайно.

Вам потрібно порівняти "встановлені пакети" з "потрібними пакетами". Це дуже близько до того, що я роблю з CRANberry, оскільки мені потрібно порівняти "збережені відомі пакети" з "відомими в даний час пакетами", щоб визначити нові та / або оновлені пакети.

Тож роби щось подібне

AP <- available.packages(contrib.url(repos[i,"url"]))   # available t repos[i]

щоб отримати всі відомі пакети, синхронний виклик для встановлених поточних пакетів та порівняйте їх із заданим набором цільових пакетів.


5

Використовуйте packratтак, щоб спільні бібліотеки були абсолютно однаковими і не змінювали оточення інших.

Щодо елегантності та найкращої практики, я думаю, ви принципово йдете про це неправильним шляхом. Пакет packratбув розроблений для цих питань. Він розроблений RStudio Hadley Wickham. Замість того, щоб їм встановити залежності та, можливо, зіпсувати чиюсь оточуючу систему, він packratвикористовує власний каталог та встановлює всі залежності для ваших програм там і не торкається когось оточення.

Packrat - система управління залежностями для Р.

Залежності від R-пакету можуть бути неприємними. Вам коли-небудь доводилося використовувати пробну та помилкову помилку, щоб з'ясувати, які пакети R потрібно встановити, щоб чийсь код працював, а потім залишилися з цими пакетами назавжди встановленими, тому що тепер ви не впевнені, чи потрібні вони ? Ви коли-небудь оновлювали пакет, щоб отримати код в одному з ваших проектів, лише щоб дізнатися, що оновлений пакет перетворює код в інший проект?

Ми створили пакет для вирішення цих проблем. Використовуйте packrat, щоб зробити ваші R проекти більше:

  • Ізольовано: Встановлення нового або оновленого пакету для одного проекту не порушить інші ваші проекти, і навпаки. Це тому, що packrat надає кожному проекту власну приватну бібліотеку пакетів.
  • Портативний: Легко транспортуйте свої проекти з одного комп’ютера на інший, навіть через різні платформи. Packrat дозволяє легко встановлювати пакети, від яких залежить ваш проект.
  • Відтворювальний: Packrat записує точні версії пакету, від яких ви залежите, і гарантує, що саме ці версії будуть встановлені там, де ви йдете.

https://rstudio.github.io/packrat/


4

Наступна проста функція працює як шарм:

  usePackage<-function(p){
      # load a package if installed, else load after installation.
      # Args:
      #   p: package name in quotes

      if (!is.element(p, installed.packages()[,1])){
        print(paste('Package:',p,'Not found, Installing Now...'))
        install.packages(p, dep = TRUE)}
      print(paste('Loading Package :',p))
      require(p, character.only = TRUE)  
    }

(не моє, знайшов це в Інтернеті деякий час назад і використовував його з тих пір. не впевнений у первинному джерелі)


4

Я використовую наступну функцію для встановлення пакета, якщо require("<package>")вихід із пакетом не знайдено помилки. Він запитає як CRAN, так і сховища біокондуктора щодо відсутнього пакету.

Адаптовано з оригінальної роботи Джошуа Вілі, http://r.789695.n4.nabble.com/Install-package-automatically-if-not-there-td2267532.html

install.packages.auto <- function(x) { 
  x <- as.character(substitute(x)) 
  if(isTRUE(x %in% .packages(all.available=TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else { 
    #update.packages(ask= FALSE) #update installed packages.
    eval(parse(text = sprintf("install.packages(\"%s\", dependencies = TRUE)", x)))
  }
  if(isTRUE(x %in% .packages(all.available=TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else {
    source("http://bioconductor.org/biocLite.R")
    #biocLite(character(), ask=FALSE) #update installed packages.
    eval(parse(text = sprintf("biocLite(\"%s\")", x)))
    eval(parse(text = sprintf("require(\"%s\")", x)))
  }
}

Приклад:

install.packages.auto(qvalue) # from bioconductor
install.packages.auto(rNMF) # from CRAN

PS: update.packages(ask = FALSE)& biocLite(character(), ask=FALSE)оновить усі встановлені пакети в системі. Це може зайняти багато часу і розглядати це як повне оновлення R, яке, можливо, не гарантується весь час!


Це можна покращити, перевіривши, чи пакети дійсно доступні на cran чи bc. Також слід використовувати бібліотеку в кінці, щоб видалити помилку, якщо встановлення не вдалося або пакет не існує. Дивіться мою поліпшену версію під назвою loadpack()на raw.githubusercontent.com/holgerbrandl/datautils/master/R / ...
Хольгер Брандл

4

Ви можете просто скористатися setdiffфункцією, щоб отримати пакунки, які не встановлені, а потім встановити їх. У наведеному нижче прикладі ми перевіряємо, чи встановлені пакети ggplot2та Rcppпакети перед їх встановленням.

unavailable <- setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages()))
install.packages(unavailable)

В одному рядку вище можна записати так:

install.packages(setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages())))

Я використовую той самий підхід. Ми також можемо використовувати installed.packages()[,'Package']замість rownames(installed.packages()).
Скуделлетті

3

Я реалізував функцію безшумно встановлювати та завантажувати необхідні пакети R. Надія може допомогти. Ось код:

# Function to Install and Load R Packages
Install_And_Load <- function(Required_Packages)
{
    Remaining_Packages <- Required_Packages[!(Required_Packages %in% installed.packages()[,"Package"])];

    if(length(Remaining_Packages)) 
    {
        install.packages(Remaining_Packages);
    }
    for(package_name in Required_Packages)
    {
        library(package_name,character.only=TRUE,quietly=TRUE);
    }
}

# Specify the list of required packages to be installed and load    
Required_Packages=c("ggplot2", "Rcpp");

# Call the Function
Install_And_Load(Required_Packages);

3

Наступна версія RStudio (1.2), яка вже доступна у вигляді попереднього перегляду, буде включати в себе функцію виявлення відсутніх пакетів у дзвінках library()та require()викликах та спонукати користувача встановити їх:

Виявити відсутні R-пакети

Багато сценаріїв R відкриваються з дзвінками library()та require()завантаженням необхідних пакетів для виконання. Якщо ви відкриєте скрипт R, на який посилаються пакети, які у вас не встановлені, RStudio запропонує встановити всі необхідні пакети одним натисканням кнопки. Більше не друкуйте install.packages()повторно, поки помилки не зникнуть!
https://blog.rstudio.com/2018/11/19/rstudio-1-2-preview-the-little-things/

Це, мабуть, особливо добре вирішує проблему первинного заходу:

Багато з них є початківцями / проміжними користувачами R і не розуміють, що їм доведеться встановлювати пакети, яких у них ще немає.


2

Що стосується вашої основної мети "встановити бібліотеки, яких у них вже немає", і незалежно від використання "instllaed.packages ()". Наступна функція маскує оригінальну функцію Requ. Він намагається завантажити та перевірити названий пакет "x", якщо він не встановлений, встановити його безпосередньо, включаючи залежності; і нарешті завантажуйте його нормально. ви перейменовуєте назву функції з "вимагати" в "бібліотеку", щоб зберегти цілісність. Єдине обмеження - це котирування назв пакетів.

require <- function(x) { 
  if (!base::require(x, character.only = TRUE)) {
  install.packages(x, dep = TRUE) ; 
  base::require(x, character.only = TRUE)
  } 
}

Таким чином, ви можете завантажити та встановити пакет старим способом R. вимагати ("ggplot2") вимагати ("Rcpp")


Якщо відповідь вам більше не подобається, не скасовуйте її - просто видаліть її.
Майкл Петротта

Ну, я спробував, але не зміг. Я думаю, що моє розширення NoScript FF відключає його, або я не маю прав та кредитів, щоб видалити власну відповідь. LoL Однак я думаю, що Лівій досить близький до моєї відповіді, подумав, не маскуючись. Дякую Майклу Петротта. для повідомлення.
GeoObserver

Ви повинні побачити deleteпосилання над цими коментарями. Якщо ви цього не зробите і все ще хочете видалити, скористайтеся flagпосиланням, виберіть "інше" та поясніть модератору, що ви хочете, щоб відповідь була видалена.
Майкл Петротта

2

Досить базовий.

pkgs = c("pacman","data.table")
if(length(new.pkgs <- setdiff(pkgs, rownames(installed.packages())))) install.packages(new.pkgs)

2

Думав, я б сприяв тому, кого я використовую:

testin <- function(package){if (!package %in% installed.packages())    
install.packages(package)}
testin("packagename")


2

Використовуючи підхід сімейства ламп та анонімних функцій, ви можете:

  1. Спробуйте долучити всі перелічені пакети.
  2. Встановити лише відсутні (за допомогою ||ледачих оцінок).
  3. Спроба приєднати знову ті, які були відсутні на кроці 1 та встановлені на кроці 2.
  4. Роздрукуйте кінцевий стан завантаження кожного пакету ( TRUE/ FALSE).

    req <- substitute(require(x, character.only = TRUE))
    lbs <- c("plyr", "psych", "tm")
    sapply(lbs, function(x) eval(req) || {install.packages(x); eval(req)})
    
    plyr psych    tm 
    TRUE  TRUE  TRUE 

1

Я використовую наступне, яке перевірить, чи встановлено пакет, і чи залежать оновлення залежностей, а потім завантажує пакунок.

p<-c('ggplot2','Rcpp')
install_package<-function(pack)
{if(!(pack %in% row.names(installed.packages())))
{
  update.packages(ask=F)
  install.packages(pack,dependencies=T)
}
 require(pack,character.only=TRUE)
}
for(pack in p) {install_package(pack)}

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}

1

Ось мій код для цього:

packages <- c("dplyr", "gridBase", "gridExtra")
package_loader <- function(x){
    for (i in 1:length(x)){
        if (!identical((x[i], installed.packages()[x[i],1])){
            install.packages(x[i], dep = TRUE)
        } else {
            require(x[i], character.only = TRUE)
        }
    }
}
package_loader(packages)

1
 48 lapply_install_and_load <- function (package1, ...)
 49 {
 50     #
 51     # convert arguments to vector
 52     #
 53     packages <- c(package1, ...)
 54     #
 55     # check if loaded and installed
 56     #
 57     loaded        <- packages %in% (.packages())
 58     names(loaded) <- packages
 59     #
 60     installed        <- packages %in% rownames(installed.packages())
 61     names(installed) <- packages
 62     #
 63     # start loop to determine if each package is installed
 64     #
 65     load_it <- function (p, loaded, installed)
 66     {
 67         if (loaded[p])
 68         {
 69             print(paste(p, "loaded"))
 70         }
 71         else
 72         {
 73             print(paste(p, "not loaded"))
 74             if (installed[p])
 75             {
 76                 print(paste(p, "installed"))
 77                 do.call("library", list(p))
 78             }
 79             else
 80             {
 81                 print(paste(p, "not installed"))
 82                 install.packages(p)
 83                 do.call("library", list(p))
 84             }
 85         }
 86     }
 87     #
 88     lapply(packages, load_it, loaded, installed)
 89 }

1
library <- function(x){
  x = toString(substitute(x))
if(!require(x,character.only=TRUE)){
  install.packages(x)
  base::library(x,character.only=TRUE)
}}

Це працює з котируваними назвами пакетів і є досить елегантним (пор. Відповідь GeoObserver)


1

У моєму випадку я хотів одного вкладиша, який я міг би запустити з командного рядка (фактично через 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).


0
  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)
}

0

Дозвольте мені поділитися трохи божевілля:

c("ggplot2","ggsci", "hrbrthemes", "gghighlight", "dplyr") %>%  # What will you need to load for this script?
  (function (x) ifelse(t =!(x %in% installed.packages()), 
    install.packages(x[t]),
    lapply(x, require))) 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.