require ()와 library ()의 차이점은 무엇입니까?


565

차이점은 무엇이며 require()그리고 library()?



7
@Yihui의 블로그 게시물에 대한 링크를 추가하여 답변으로 해당 버전을 게시하지 않는 경우. yihui.name/ko/2014/07/library-vs-require
MichaelChirico

4
@Yihui의 블로그 게시물을 요약하면 : "숙녀 여러분, 전에 말한 적이 있습니다. require ()는 R 패키지를로드하는 잘못된 방법입니다; 대신 library ()를 사용하십시오"
De Novo

1
@DanHall ... library()패키지가 설치되지 않았거나로드 할 수없는 경우 관련 오류 메시지 (패키지가 설치되지 않았거나로드 할 수없는 경우)와 함께 즉시 실패 하기 때문에 오류가 발생 require()하지 않고 boolean FALSE를 자동으로 반환합니다. Error: object “bar” not found175 번 줄로 코드가 나중에 암호 적으로 실패하게합니다.
smci

1
@ KonradRudolph : 완료! 의견을 보내 주셔서 감사합니다.
Marco

답변:


86

이미 제공된 좋은 조언 외에도 다음과 같이 덧붙입니다.

실제로 값을 사용 require() 하지 않는 한 , 예를 들어 thierry에서 제공 한 것과 같은 오류 검사 루프에서 사용 하지 않는 한 사용 하지 않는 것이 가장 좋습니다 .

대부분의 경우 library()패키지를 사용할 수없는 경우 패키지를로드 할 때 오류 메시지가 표시되므로을 사용하는 것이 좋습니다 . require()패키지가 없으면 오류없이 실패합니다. 지금은 패키지를 설치해야하는지 (또는 철자가 틀 렸기 때문에 존재하지 않는 경우) 알아볼 수있는 가장 좋은시기입니다. 오류 피드백을 조기에 그리고 관련 시간에 확보하면 라이브러리 루틴을 사용하려고 할 때 이후 코드가 실패하는 이유를 추적하여 두통을 피할 수 있습니다.


356

일상적인 일에는 그다지 많지 않습니다.

그러나 두 함수에 대한 문서에 따르면 ( ?함수 이름 앞에 넣고 Enter 키를 누르면 액세스 됨 ) require경고가 출력되고 패키지를 찾지 못하면 계속되는 동안 함수 내부에서 사용되며 library오류가 발생합니다.


1
#richiemorrisroe : 감사합니다. R 코드의 맨 처음에 필요한 패키지를로드하면 선택한 코드가 중요하지 않습니까?
Marco

6
함수 내에서 패키지를로드하지 않는 한 실제로 차이가 없습니다. require를 사용하여 모든 패키지를로드하고 질문을 본 후 도움말을 읽을 때까지 차이점이 무엇인지 알지 못했습니다.
richiemorrisroe

45
내가 사용하는 다른 이유 require는 패키지를 librariesR-cognoscenti를 벽으로 몰아 넣는 관행이라고 언급하지 않기 때문 입니다. 는 library패키지가 앉아 디렉토리 위치입니다.
IRTFM

22
그들은 매우 관련성이 있습니다. 사용하지 마십시오 require, 하지 않는 한 당신은 반환 값을 확인 (그 경우, 일반적으로 예를 더 나은 대안이있다 loadNamespace).
Konrad Rudolph

256

또 다른 장점은 require()기본적으로 논리 값을 반환한다는 것입니다. TRUE패키지가로드 된 FALSE경우 로드 되지 않은 경우

> test <- library("abc")
Error in library("abc") : there is no package called 'abc'
> test
Error: object 'test' not found
> test <- require("abc")
Loading required package: abc
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called 'abc'
> test
[1] FALSE

따라서 require()아래와 같은 구조로 사용할 수 있습니다 . R 설치에 코드를 배포하려는 경우 주로 패키지가 설치되지 않았을 때 편리합니다.

if(require("lme4")){
    print("lme4 is loaded correctly")
} else {
    print("trying to install lme4")
    install.packages("lme4")
    if(require(lme4)){
        print("lme4 installed and loaded")
    } else {
        stop("could not install lme4")
    }
}

65

다음 require()과 같이 필요한 경우에만 패키지를 설치하려는 경우 사용할 수 있습니다 .

if (!require(package, character.only=T, quietly=T)) {
    install.packages(package)
    library(package, character.only=T)
}

여러 패키지의 경우 사용할 수 있습니다

for (package in c('<package1>', '<package2>')) {
    if (!require(package, character.only=T, quietly=T)) {
        install.packages(package)
        library(package, character.only=T)
    }
}

프로 팁 :

  • 스크립트 내에서 사용될 때 다음 과 같은 repos매개 변수를 지정하여 대화 상자 화면을 피할 수 있습니다.install.packages()

    install.packages(package, repos="http://cran.us.r-project.org")
  • 당신은 포장 수 require()library()suppressPackageStartupMessages()에, 음, 억제 패키지 시작 메시지는 또한 매개 변수를 사용 require(..., quietly=T, warn.conflicts=F)를 설치한다 조용한을 유지하기 위해 필요한 경우.


46

항상 사용하십시오 library. 결코 사용 require.

( 1 거의 없음. 아마도 .)

간단히 말해서, 이는을 사용할 때 require오류를 알리지 않고 코드에서 다른 잘못된 결과를 생성 할 수 있기 때문 입니다. 이것은 드물지만 가설은 아닙니다! {dplyr}의로드 가능 여부에 따라 다른 결과생성 하는이 코드를 고려하십시오 .

require(dplyr)

x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)

이것은 미묘하게 잘못된 결과를 초래할 수 있습니다. library대신에를 사용 require하면 오류가 발생하여 무언가 잘못되었음을 명확하게 알립니다. 이것은 좋다 .

또한 다른 모든 오류를 디버깅하기가 더 어려워집니다. require스크립트를 시작할 때 패키지를 500 행에서 내보내기를 사용하면 500 행에 "개체 'foo'를 찾을 수 없습니다"라는 오류 메시지가 표시됩니다. “bla이라는 패키지가 없습니다”오류.

유일하게 허용되는 유스 케이스 require는 다른 답변 중 일부에서 볼 수 있듯이 반환 값을 즉시 확인 하는 경우입니다 . 이것은 매우 일반적인 패턴이지만 이러한 경우에도 존재 확인과 패키지로드를 분리하는 것이 좋습니다 (아래 참조).

보다 기술적으로 require실제로 library내부적으로 호출합니다 (패키지가 아직 연결되어 있지 않은 경우 패키지가 이미로드되었는지 여부 확인 require하기 때문에 중복 검사를 수행함 ). 다음은 기능 을 설명하기 위한 단순화 된 구현입니다 .library require

require = function (package) {
    already_attached = paste('package:', package) %in% search()
    if (already_attached) return(TRUE)
    maybe_error = try(library(package, character.only = TRUE)) 
    success = ! inherits(maybe_error, 'try-error')
    if (! success) cat("Failed")
    success
}

숙련 된 R 개발자는 다음에 동의합니다.

{knitr}, {bookdown} 및 기타 여러 패키지의 저자 인 Yihui Xie 다음 과 같이 말합니다 .

신사 숙녀 여러분, 전에 말한 적이 있습니다. require ()는 R 패키지를로드하는 잘못된 방법입니다. 대신 library ()를 사용하십시오.

다른 누구보다 더 인기있는 R 패키지의 저자 인 Hadley Wickham 은 말합니다.

library(x)데이터 분석 스크립트에서 사용하십시오 . […] 당신 은 사용할 필요가 없습니다 require()( requireNamespace()거의 항상 좋습니다)


구문 class::function을 사용 library()하여 모든 함수를 호출하지 않는 한 정확히 동일하게 가리킬 것 입니다.
Ghost

19
?library

당신은 볼 것이다 :

library(package)그리고 require(package)모두 부하는 이름의 패키지 package및 검색 목록에 넣어. require다른 기능 내에서 사용하도록 설계되었습니다. 패키지가 존재하지 않으면 (기본적으로 FALSE오류가 아닌) 경고를 반환 하고 제공 library()합니다. 두 기능 모두 현재로드 된 패키지 목록을 확인 및 업데이트하고 이미로드 된 패키지를 다시로드하지 않습니다. (이러한 패키지를 다시로드하려면 detach(unload = TRUE)또는을 호출하십시오 unloadNamespace.) 검색 목록에 패키지를 넣지 않고 패키지를로드하려면을 사용하십시오 requireNamespace.


9

차이점에 대한 나의 초기 이론은 library패키지가 이미로드되었는지 여부에 관계없이 패키지 를 로드 한다는 것입니다. 즉, 이미로드 된 패키지를 다시로드 할 수는 있지만 패키지 require가로드되었는지 확인하거나 그렇지 않은 경우로드 특정 패키지에 의존합니다). 그러나이 문서는 이것을 반박하고, 어떤 함수도 이미로드 된 패키지를 다시로드하지 않을 것이라고 명시합니다.


18
이것은 흥미롭지 만 실제로 질문에 대한 답이 아닙니다 ...?
벤 Bolker


3

이미로드 된 패키지의 차이점이있는 것 같습니다. require와 library 모두 패키지를로드하지 않는 것이 사실입니다. 라이브러리는 확인하고 종료하기 전에 다른 많은 작업을 수행합니다.

어쨌든 2mil 번 실행되는 함수의 시작 부분에서 "필수"를 제거하는 것이 좋지만 어떤 이유로 든 유지해야했습니다. 기술적으로 더 빠른 검사입니다.

microbenchmark(req = require(microbenchmark), lib = library(microbenchmark),times = 100000)
Unit: microseconds
 expr    min     lq      mean median     uq        max neval
  req  3.676  5.181  6.596968  5.655  6.177   9456.006 1e+05
  lib 17.192 19.887 27.302907 20.852 22.490 255665.881 1e+05

나는 이것이 library대신 구현을 수정 해야하는 강력한 이유라고 주장하고 있다 (현재 R과 함께 제공되는 함수는 모두 엉망이다).
Konrad Rudolph

@KonradRudolph 글쎄, 누군가가 라이브러리를 고치려는 경우, 아마도 명시 적으로 버전으로로드 할 수 있고 첨부 옵션을 인수 옵션으로 만들 수 있습니다.
Shape

예, 전적으로 동의하지만 성능뿐만 아니라 의미가 변경됩니다. 어쨌든, 버전 관리는 불행히도 R의 패키지에서는 작동하지 않습니다. 나는 이것을 대체하기 위해 노력하고 있습니다 (정말!). 첨부 loadNamespace하는 경우 패키지를로드하고 첨부하지 않고 네임 스페이스를 반환하는을 사용할 수 있습니다 .
Konrad Rudolph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.