programing

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

iphone6s 2023. 6. 6. 00:36
반응형

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

사이의 차이점은 무엇입니까?require()그리고.library()?

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

그러나 두 기능에 대한 설명서에 따르면 (다음을 입력하여 액세스함)?및enter 앞), 함수이 히트 ),▁before▁the에앞),,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() 당신이 실제로 그 값을 사용하지 않는 한, 예를 들어 그들의 시도에 의해 주어진 것과 같은 몇몇 오류 확인 루프에서 반환됩니다.

대부분의 다른 경우에는 사용하는 것이 좋습니다.library()패키지를 사용할 수 없는 경우 패키지를 로드할 때 오류 메시지가 표시되기 때문입니다. require()패키지가 없으면 오류 없이 실패합니다.패키지를 설치해야 하는지(또는 잘못된 철자로 인해 존재하지 않는지) 확인할 수 있는 최적의 시간입니다.할 때 할 수 있는 수 .

항상사를 합니다.library절대로 용안함을 사용하지 .require.

tl;dr:require강력한 소프트웨어 시스템의 기본 규칙 중 하나인 조기에 실패합니다.

간단히 말해서, 이것은 사용할 때require코드가 오류 신호 없이 다른 잘못된 결과를 생성할 수 있습니다.이것은 드물지만 가상적이지는 않습니다!{dplyr}을(를) 로드할 수 있는지 여부에 따라 다른 결과를 산출하는 이 코드를 고려하십시오.

require(dplyr)

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

이는 미묘하게 잘못된 결과를 초래할 수 있습니다.용사를 합니다.libraryrequire여기에 오류를 던져서 뭔가 잘못되었다는 것을 분명히 알립니다.이거 맛있어요.

또한 다른 모든 오류를 디버깅하기가 더 어렵습니다.네가 만약require스크립트 시작 부분에 패키지가 있고 500행에 해당 내보내기를 사용하면 500행에 "bla라는 패키지가 없습니다"라는 오류 메시지 대신 "object 'foo' not found"라는 오류 메시지가 표시됩니다.

허가사사례의 유일한 허용 require다른 답변 중 일부에서 알 수 있듯이 반환 값이 즉시 확인되는 경우입니다.이는 상당히 일반적인 패턴이지만 이러한 경우에도 존재 확인과 패키지 로드를 대신 분리하는 것이 좋습니다(아래 참조 권장). 즉: 사를 합니다.requireNamespacerequire이 경우에는

더 말하면, 좀더엄말면하히밀,,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} 및 기타 많은 패키지의 저자인 Xii Hie는 다음과 같이 말합니다.

신사 숙녀 여러분, 제가 전에 말했듯이: require()는 R 패키지를 로드하는 잘못된 방법입니다. 대신 라이브러리()를 사용하십시오.

누구보다도 인기 있는 R 패키지의 저자인 해들리 위컴은 말합니다.

사용하다library(x)데이터 분석 스크립트에서. […] ▁[▁need다없▁[니 습▁never▁use…require()(requireNamespace()거의 항상 더 좋습니다)

사용할 수 있습니다.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

그러면 다음을 보게 될 것입니다.

library(package)그리고.require(package) 다 이 " 둘다이으로패로드다니합를지키름다▁with▁both▁the▁load"인 를 로드합니다.package검색 목록에 올려놓았습니다. require다른 함수 내부에서 사용하도록 설계되었습니다. 반환됩니다.FALSE그리고 (로서의 오류보다는) 경고를 줍니다.library()패키지가 존재하지 않는 경우 기본적으로 수행됨).두 기능 모두 현재 로드된 패키지 목록을 확인하고 업데이트하며 이미 로드된 패키지는 다시 로드하지 않습니다.(이러한 패키지를 다시 로드하려면 전화하십시오.)detach(unload = TRUE)또는unloadNamespace첫째를 검색 에 넣지 하려면 패지를검목넣않지로다사음용니합면을려드하를 사용합니다.requireNamespace.

그 차이에 대한 나의 초기 이론은library이미 로드되었는지 여부에 관계없이 패키지를 로드합니다. 즉, 이미 로드된 패키지를 다시 로드할 수 있습니다.require로드되었는지 확인하거나 로드되지 않은 경우 로드합니다(특정 패키지에 의존하는 함수에서 사용 가능).그러나 설명서는 이를 반박하며 두 함수 모두 이미 로드된 패키지를 다시 로드하지 않는다고 명시합니다.

여기에 이미 적재된 패키지의 차이가 있는 것 같습니다.required 및 library 둘 다 패키지를 로드하지 않는 것은 사실입니다.라이브러리는 확인하고 종료하기 전에 많은 다른 작업을 수행합니다.

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

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

언급URL : https://stackoverflow.com/questions/5595512/what-is-the-difference-between-require-and-library

반응형