한 번에 여러 패키지로드


174

require 명령을 반복해서 입력하지 않고 여러 패키지를 한 번에로드하려면 어떻게해야합니까? 나는 충돌과 화상의 세 가지 접근법을 시도했습니다.

기본적으로 패키지 이름의 벡터를로드 할 함수에 제공하고 싶습니다.

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

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

답변:


251

제안 된 함수의 여러 순열은 작동하지만 character.only인수를로 지정하는 경우에만 작동 합니다 TRUE. 빠른 예 :

lapply(x, require, character.only = TRUE)

@ 토미 & daroczig-쿨. 훨씬 더 깨끗한 솔루션입니다. 나는 후손과 OP의 시도가 작동하지 않은 이유에 대해 보여줄 것입니다.
Josh O'Brien

4
부분 문자 일치를 이용하여 lapply (x, require, ch = T) 또는 lapply (x, require, c = T)로
도망 칠 수 있습니다

@daroczig이 코드는 패키지를로드하지만 왜 다음과 같은 경고 메시지를 표시합니까? 1 : library (package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : 호출 된 패키지가 없습니다 'x'2 : in if (! loaded) {: 조건의 길이가 1보다 길고 첫 번째 요소 만 사용됩니다
Anusha

@Anusha : 나는 당신이 무엇을 가지고있는 ATM을 모른다 x.
daroczig

23
R :: base가이 lapply트릭을 네이티브에 추가했다면 좋을 것 library()입니다. 말할 수있게 되십시오 :library(c("plyr", "umx"))

58

내가 유지하는 CRAN 패키지 팩맨 (Dason Kurkiewicz와 함께 작성)은 다음을 수행 할 수 있습니다.

따라서 사용자는 다음을 수행 할 수 있습니다.

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

패키지가 없으면 p_loadCRAN 또는 Bioconductor에서 다운로드합니다.


7
+1! 왜 짧은 이름을 선택 했 p_load습니까? load_packages함수의 의도를보다 명확하게하는 것과 같이보다 설명적인 이름 입니다.
Paul Hiemstra

19
p는 패키지를 의미하기 때문입니다. 유용하고 내 보낸 패키지의 모든 기능은로 시작합니다 p_. 또한 우리는 라이브러리를 조금 사용하는 경향이 있으며 추가로 7 자입니다. 7 자 x ~ 1000000 수명 사용 기능 x 문자 당 0.5 초 = 3500000 초 즉 우리의 목표 2 월 1 크랑에 밀어 어떤 경우에도 우리는 그들에게 다시 준 58333.33 분, 972.2222 시간 프로그래머의 삶의 40.50926 일을 :-)입니다
타일러 스케이트 타는

3
약 1 년 늦었지만 마침내 CRAN에 제출했습니다. 며칠 안에 일어나야합니다. @trinker (또는 나)는 공개되면 이것을 수정해야합니다.
Dason

5
@Tyler 나는 몇 년 늦었다는 것을 알고 있지만 p_접두사에 대한 당신의 근거는 다소 모호합니다. 간결함이 문제인 경우 p_접두사를 완전히 제거하십시오 . 사실, 그러한 접두사를 갖는 것은 일반적으로 다른 언어로 권장되지 않습니다 (저는 Hadley에게 fct_Forcats의 무의미한 점과 동일 하다고 말했습니다). 이 패키지의 의도 된 용도가 정규화 된 네임 스페이스 ( )를 사용하기 때문에 특히 그렇습니다 pacman::.
Konrad Rudolph

5
@TylerRinker이 문제에 대해 싸우는 것에 대해 사과하지만, R 커뮤니티는 단순히 여기에서 잘못되었다고 생각합니다. 거의 모든 다른 현대 언어가 올바르게 작동합니다. "이것은 네임 스페이스 충돌을 방지합니다." — 그러나 이것이 네임 스페이스를위한 것입니다! 패키지 작성자에 대한 책임은 사람들에게 느슨한 프로그래밍 실습을 수용하지 않고 패키지를 올바르게 사용하도록 교육하는 것입니다.
Konrad Rudolph

24

트릭을 수행해야합니다.

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

(핵심 요소는 args인수 가 하나의 요소 만있는 경우에도 목록 에 do.call(what, args) 있어야한다는 것입니다!)


16

동시에 패키지를 설치하고로드하려는 사람을 위해이 링크 에서이 기능을 발견했습니다.

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

안녕하세요, 주어진 스 니펫에서 R 파일을 만들었습니다. Amazon EMR 서비스에서 해당 스크립트를 실행하면 다음 URL에 지정된대로 다음과 같은 출력이 표시됩니다. pastie.org/10402378#3,10-11,13 .
Rubin Porwal

9

다른 옵션은 패키지에서 제공됩니다 easypackages. 일단 설치되면 가장 직관적 인 방법으로 패키지를로드 할 수 있습니다.

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

패키지에는 여러 패키지를 설치하는 기능도 포함되어 있습니다.

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

여기를 참조 하십시오 .


함수 이름은 다소 혼란스럽고 혼란 스럽습니다. 이 library기능 에서 "라이브러리" 는 패키지가 설치된 위치 ( 패키지 라이브러리)를 나타 냅니다. 통해 여러 패키지를로드하는 것은 libraries의미가 없습니다. 다른 기능 packages을 수행 하는 별도의 기능 이 있으면 더 악화됩니다. 이름은 소프트웨어 엔지니어링에서 어려운 문제이지만 실제로는 문제라는 것을 알고 있습니다. 이 이름은 특히 나쁩니다.
Konrad Rudolph

2
@KonradRudolph 나는 그 이름 libraries이 의미가 없다는 것에 동의하지 않는다 . 그것은 복수의 librarylibrary부하를 하나의 패키지를; libraries복수의 패키지를로드한다. library"단일 라이브러리에서로드"를 의미 하는 것으로 생각 하고 libraries이를 "여러 라이브러리에서로드" 를 의미 하도록 확장하는 경우 이는 직관적이지 않을 수 있지만 의도는 아닙니다. 나는 그 이름에 매우 만족할 것이다 libraries.
Jamie S

@JamieS 그러나 여전히 (보통) 단일 라이브러리에서로드 중입니다. 라이브러리와 패키지를 혼동하는 것 같습니다 (공평하게 R에서 일반화되었습니다). 이전의 언급에서 언급했듯이 "R 라이브러리"는 R 패키지가 설치된 위치 (디렉토리 / 디렉토리)를 나타냅니다. . 이 답변의 예에서 "plyr", "psych"및 "tm"은 라이브러리 가 아니라 패키지입니다.
Konrad Rudolph

4

lubripack 패키지를 사용하면 새 패키지를 깔끔하게 설치 한 다음 모든 패키지를 한 줄에로드 할 수 있습니다.

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

RStudio에서 위의 코드를 실행 한 후의 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

패키지 설치 방법 :

아래 코드를 실행하여 패키지를 다운로드하고 GitHub에서 설치하십시오. GitHub 계정이 없어도됩니다.

library(devtools)
install_github("espanta/lubripack")

5
텍스트 대신 이미지를 사용하는 것 같아요
Unfun Cat

3
이것은 또한 아직 답변되지 않은 방식으로 질문에 답변하지 않으며 대부분 자체 판촉 인 것으로 보입니다.
Tyler Rinker

네 말이 맞아, 나는 암묵적으로 질문에 대답하려고 노력했다. 질문에 대한 답변이 될 수 있기를 바라고 명시 적으로하자.
Espanta

@TylerRinker 지금 어때요?
Espanta

3

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)

2

다음 기능을 사용합니다.

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

로드를 시도하고 설치에 실패하면 다시로드하십시오.


2

I는 @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()기능을 사용 하면 목록 개체의 내용이 표시되지 않고 렌더링 된 노트북 파일의 혼란을 막을 수 있습니다.


1

팩맨 설치 및로드 확인을 추가하는 Tyler Rinker의 답변의 약간의 수정 :

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

나는 인용을 피하기 때문에 p_load 솔루션을 좋아합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.