Заредете няколко пакета наведнъж

Как мога да заредя куп пакети наведнъж, без да въвеждам повторно командата require отново и отново? Опитах три подхода, всички от които се сриват и изгарят.

По принцип искам да предоставя вектор от имена на пакети на функция, която ще ги зареди.

x<-c("plyr", "psych", "tm")

require(x)
lapply(x, require)
do.call("require", x)

person Tyler Rinker    schedule 17.11.2011    source източник


Отговори (10)


Няколко пермутации на предложените от вас функции наистина работят -- но само ако посочите аргумента character.only да бъде TRUE. Бърз пример:

lapply(x, require, character.only = TRUE)
person daroczig    schedule 17.11.2011
comment
@Tommy & daroczig -- Страхотно. Това е много по-чисто решение. Ще оставя моята само за бъдещи поколения и за това, което показва защо опитите на OP не са успели. - person Josh O'Brien; 18.11.2011
comment
Можете да се възползвате от частичното съвпадение на знаци и да се измъкнете с lapply(x, require, ch = T) или дори lapply(x, require, c = T) - person Dason; 18.11.2011
comment

Функциите .call към оста ви дават хубав начин да създадете всички тези линии и текстови елементи наведнъж, но нищо не ви пречи след това да се върнете, за да изберете отделни части от създаденото и да му придадете допълнителен стил. Нещо като това:

var yAxisNodes = vis.append("g")
  .attr("class", "y axis")
  .style({ 'stroke': 'Black', 'fill': 'none', 'stroke-width': '3px'})
  .call(yAxis);
yAxisNodes.selectAll('text').style({ 'stroke-width': '1px'});
- person Anusha; 01.11.2012
comment
@Anusha: Нямам представа банкомат, какво имаш в x? - person daroczig; 01.11.2012
comment
@daroczig Просто изпълнявам кода, даден тук. Командата do.call е променена на do.call(require, list(x)) в противен случай няма да се изпълнява. Ако помага, използвайки rstudio. - person Anusha; 01.11.2012
comment
@Anusha: Трябва да пропусна нещо очевидно, но никога не съм писал do.call в отговора си, така че съм малко озадачен от отговора ви. - person daroczig; 01.11.2012
comment
@daroczig Съжалявам. Мислех, че добавяте character.only=T към въпросния код. И следващият отговор на Джош също включваше командата do.call. Може би една редакция може да изясни за други читатели. - person Anusha; 01.11.2012
comment
@daroczig: може ли това да се разшири, като се добави извикване за инсталиране на всички липсващи пакети от списъка, предоставен от x? - person Paulo E. Cardoso; 19.02.2013
comment
@PauloCardoso: разбира се, но това може да е по-дълго от едноредов :) По принцип трябва да проверите върнатата стойност на require и да изпълните install.packages, ако това доведе до FALSE, и require отново. Моля, отворете нов въпрос (и евентуално връзка тук), ако се затрудните. - person daroczig; 19.02.2013
comment
@daroczig: благодаря. Мисля, че това ще свърши работа: new.packs ‹- packs[!(packs %in%installed.packages()[,Package])] if(length(new.packs)) install.packages(new.packs) lapply (new.packages, require, character.only=T). Комбиниране на вашия и Шейн пример от тук - person Paulo E. Cardoso; 20.02.2013
comment
@PauloCardoso: точно така. Въпреки че бих помислил по-скоро за нещо като lapply(x, function(x) {if (!require(x, character.only=T)) {install.packages(x);require(x)}}), за да спестя всички предварителни проверки и да правя инсталирането само при поискване. Ако посочим списък с пакети, които да бъдат заредени (и инсталирани, ако е необходимо) в x знак - точно както OP поиска. Но става доста дълго, за да доразвием това в коментар :) - person daroczig; 20.02.2013
comment
Бъдете добри, ако R::base добави този lapply трик към library(). Бъдете страхотни да можете да кажете: library(c("plyr", "umx")) - person tim; 28.06.2015

CRAN пакетът pacman, който поддържам (създаден с Dason Kurkiewicz), може да постигне това:

Така че потребителят може да направи:

## install.packages("pacman")
pacman::p_load(dplyr, psych, tm) 

и ако пакетът липсва, p_load ще го изтегли от CRAN или Bioconductor.

person Tyler Rinker    schedule 22.03.2013
comment
+1! Защо избрахте краткото име p_load? По-описателно име като load_packages прави намерението на функцията по-ясно. - person Paul Hiemstra; 12.01.2014
comment
Тъй като p означава пакет. Всяка функция в пакета, която е полезна и експортирана, започва с p_. Освен това сме склонни да използваме малко библиотека и това са допълнителни 7 знака. 7 знака x ~1 000 000 използване на функцията през целия живот x 0,5 секунди на знак = 3500 000 секунди. Това са 58333,33 минути, 972,2222 часа или 40,50926 дни от живота на програмиста, който сме им върнали :-) Във всеки случай нашата цел е да преминем към CRAN до 1 февруари - person Tyler Rinker; 12.01.2014
comment
Около година закъснение, но най-накрая се подадохме на CRAN. Трябва да стане до няколко дни. @trinker (или аз) не забравяйте да промените това, след като стане публично достояние. - person Dason; 15.02.2015
comment
@Tyler Знам, че закъснях с години, но намирам обосновката ти за префикса p_ за доста съмнителна. Ако проблемът е в краткостта, премахнете напълно префикса p_. Всъщност наличието на такива префикси обикновено не се препоръчва на други езици по основателни причини (казах на Хадли, че те са същите по отношение на неговите fct_ глупости в forcats). Това е особено вярно, тъй като предвиденото използване на пакета е с квалифицирано пространство от имена (pacman::). - person Konrad Rudolph; 23.02.2017
comment
@KonradRudolph Виждам смисъла, но вече има много функции в общи R пакети, включително базови пакети с тези имена. Това предпазва от конфликти в пространството на имената. Посочвате, че използвам pacman::, но е глупаво да се вярва, че всеки ще използва пакет по начина, по който го правя. Като повечето всичко има компромис. Тук компромисът е краткост срещу описателност срещу конфликти в пространството на имената. Освен това в този момент промяна като тази би нарушила кода на твърде много хора. - person Tyler Rinker; 23.02.2017
comment
@TylerRinker Извинявам се, че съм войнствен по този въпрос, но наистина смятам, че R общността просто греши тук и почти всеки друг съвременен език го разбира правилно: Вие казвате „Това предпазва от конфликти в пространството на имената“. — Но ето за какво са пространствата от имена! Задължението на авторите на пакети е да образоват хората да използват пакетите правилно, а не да се приспособяват към техните небрежни практики на програмиране. - person Konrad Rudolph; 23.02.2017
comment
Готино! Предполагам, че това решава въпроси stackoverflow.com/q/9341635/1169233 и stackoverflow.com/q/4090169/1169233 (Виждам, че сте публикували отговор на последния, но не и на първия, който така или иначе е затворен). - person Waldir Leoncio; 08.02.2018
comment
@TylerRinker, благодаря много за удобното решение - има ли също начин да се използва p_load() върху низов вектор от пакети, да речем pks <- c("devtools", "tidyverse")? - person Ivo; 12.11.2019
comment
@Иво character.only = TRUE или p_load(char = pks) - person Tyler Rinker; 12.11.2019
comment
Този подход от Мичъл О'Хара-Уайлд е полезно - person p0bs; 28.06.2021

Това трябва да свърши работа:

lapply(x, FUN = function(X) {
    do.call("require", list(X)) 
})

(Ключовото нещо е, че аргументът args в do.call(what, args) трябва да бъде списък --- дори ако има само един елемент!)

person Josh O'Brien    schedule 17.11.2011

За някой, който иска да инсталира и зарежда пакети едновременно, попаднах на тази функция от тази връзка

# ipak function: install and load multiple R packages.
# check to see if packages are installed. Install them if they are not, then load them into the R session.

ipak <- function(pkg){
new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
if (length(new.pkg)) 
    install.packages(new.pkg, dependencies = TRUE)
sapply(pkg, require, character.only = TRUE)
}

# usage
packages <- c("ggplot2", "plyr", "reshape2", "RColorBrewer", "scales", "grid")
ipak(packages)
person bala    schedule 12.06.2014
comment
Здравейте, създадох R файл от дадения ви фрагмент. Когато стартирам този скрипт в услугата Amazon EMR, той ми дава следния изход, както е посочено в следния URL адрес. pastie.org/10402378#3,10-11,13. - person Rubin Porwal; 07.09.2015

Алтернативна опция идва от пакета easypackages. Веднъж инсталирани, можете да зареждате пакети по най-интуитивния начин:

libraries("plyr", "psych", "tm")

Пакетът включва и функция за инсталиране на няколко пакета:

packages("plyr", "psych", "tm")

Справка тук.

person luchonacho    schedule 01.12.2016
comment
Името на функцията е доста объркващо/объркано. „библиотека“ във функцията library се отнася до мястото, където са инсталирани пакетите: библиотеката с пакети. Зареждането на няколко пакета чрез libraries няма смисъл. Наличието на отделна функция packages, която прави нещо друго, само влошава това. Знам, че наименуването е труден проблем в софтуерното инженерство, но наистина. Тези имена са особено лоши. - person Konrad Rudolph; 23.02.2017
comment
@KonradRudolph Не съм съгласен, че името libraries няма смисъл. Това е множествено число на library, а library зарежда единичен пакет; libraries зарежда множество пакети. Ако смятате, че library означава зареждане от вашата единична библиотека и разширите това до libraries, което означава зареждане от множество библиотеки, тогава това може би е неинтуитивно, но не това е намерението; Бих бил много доволен от името libraries. - person Jamie S; 03.10.2018
comment
@JamieS Но все още (обикновено) се зарежда от една библиотека. Изглежда обърквате библиотека и пакет (което, за да бъдем честни, стана често срещано в R): „R библиотеката“, както каза предишният ми коментар, се отнася до местоположението(ата) (директория/директории), където са инсталирани R пакети . В примера на този отговор „plyr“, „psych“ и „tm“ не са библиотеки: те са пакети. - person Konrad Rudolph; 04.10.2018

Мисля, че кодът, предоставен от @daroczig, може да бъде подобрен чрез замяна на require с library и обвиване на lapply извикването във функцията invisible(). И така, подобреният код ще изглежда така:

invisible(lapply(x, library, character.only = TRUE))

Този код е подобрен, защото:

  1. library() обикновено се предпочита пред require() за зареждане на пакети, тъй като първият дава грешка, ако пакетът не е инсталиран, докато вторият само дава предупреждение. Освен това, require() извиква library(), така че защо просто не използвате library() директно!

    library("time")
    # Error in library("time") : there is no package called ‘time’
    
    require("time")
    # Loading required package: time
    # Warning message:
    # In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
    # there is no package called ‘time’
    
  2. Списъчният обект, върнат и отпечатан от извикването lapply(), няма смисъл в този случай, така че има смисъл да направите изхода невидим. Да кажем, че използвате R Notebook за вашата анализираща работа, използването на функцията invisible() ще потисне съдържанието на обекта на списъка и ще предотврати бъркотията в изобразения файл на бележника.

person Ashirwad    schedule 18.04.2019

Можете просто да използвате lubripack package и той спретнато инсталира нови пакети и след това да ги зареди всички на един ред.

lubripack("plyr", "psych", "tm")

Ето изхода, след като изпълните горния код в RStudio.

въведете описание на изображението тук

Как да инсталирате пакета:

Изпълнете кода по-долу, за да изтеглите пакета и да го инсталирате от GitHub. Няма нужда да имате акаунт в GitHub.

library(devtools)
install_github("espanta/lubripack")
person Espanta    schedule 23.04.2016
comment
Предполагам, че използвам изображения вместо текст - person The Unfun Cat; 03.05.2016
comment
Това също не отговаря на въпроса по начин, по който вече не е отговорено, и изглежда най-вече самореклама. - person Tyler Rinker; 09.05.2016
comment
Прав си, опитах се да отговоря имплицитно на въпроса. Нека го направим изрично, надявайки се, че може да бъде отговор на въпрос. - person Espanta; 18.05.2016
comment
@TylerRinker Как е това сега? - person Espanta; 18.05.2016

Въз основа на решението на daroczig, ако не искате да посочите списък като вход, можете да използвате

# Foo
mLoad <- function(...) {
  sapply(sapply(match.call(), as.character)[-1], require, character.only = TRUE)
}

# Example 
mLoad(plyr, dplyr, data.table)

... което е по-кратко от

lapply(list('plyr', 'dplyr', 'data.table'), require, character.only = TRUE)
person goclem    schedule 19.11.2015

Използвам следната функция:

mrip <- function(..., install = TRUE){
    reqFun <- function(pack) {
        if(!suppressWarnings(suppressMessages(require(pack, character.only = TRUE)))) {
            message(paste0("unable to load package ", pack,
                           ": attempting to download & then load"))
            install.packages(pack)
            require(pack, character.only = TRUE)
        }
    }
    lapply(..., reqFun)
}

Това се опитва да зареди и ако не успее, се инсталира и след това опитайте да заредите отново.

person ricardo    schedule 12.01.2014

Лека модификация на отговора на Tyler Rinker за добавяне на проверка за инсталиране и зареждане на pacman:

#Install/load pacman
if(!require(pacman)){install.packages("pacman");require(pacman)}
#Install/load tons of packages
p_load(plyr,psych,tm)

Харесвам решението p_load, защото избягва цитирането!

person mattador    schedule 17.06.2019