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

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



답변

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

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

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


답변

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

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


답변

또 다른 장점은 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")
    }
}


답변

다음 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)를 설치한다 조용한을 유지하기 위해 필요한 경우.


답변

항상 사용하십시오 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()거의 항상 좋습니다)


답변

?library

당신은 볼 것이다 :

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


답변

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