차이점은 무엇이며 require()
그리고 library()
?
library()
패키지가 설치되지 않았거나로드 할 수없는 경우 관련 오류 메시지 (패키지가 설치되지 않았거나로드 할 수없는 경우)와 함께 즉시 실패 하기 때문에 오류가 발생 require()
하지 않고 boolean FALSE를 자동으로 반환합니다. Error: object “bar” not found
175 번 줄로 코드가 나중에 암호 적으로 실패하게합니다.
차이점은 무엇이며 require()
그리고 library()
?
library()
패키지가 설치되지 않았거나로드 할 수없는 경우 관련 오류 메시지 (패키지가 설치되지 않았거나로드 할 수없는 경우)와 함께 즉시 실패 하기 때문에 오류가 발생 require()
하지 않고 boolean FALSE를 자동으로 반환합니다. Error: object “bar” not found
175 번 줄로 코드가 나중에 암호 적으로 실패하게합니다.
답변:
이미 제공된 좋은 조언 외에도 다음과 같이 덧붙입니다.
실제로 값을 사용 require()
하지 않는 한 , 예를 들어 thierry에서 제공 한 것과 같은 오류 검사 루프에서 사용 하지 않는 한 사용 하지 않는 것이 가장 좋습니다 .
대부분의 경우 library()
패키지를 사용할 수없는 경우 패키지를로드 할 때 오류 메시지가 표시되므로을 사용하는 것이 좋습니다 . require()
패키지가 없으면 오류없이 실패합니다. 지금은 패키지를 설치해야하는지 (또는 철자가 틀 렸기 때문에 존재하지 않는 경우) 알아볼 수있는 가장 좋은시기입니다. 오류 피드백을 조기에 그리고 관련 시간에 확보하면 라이브러리 루틴을 사용하려고 할 때 이후 코드가 실패하는 이유를 추적하여 두통을 피할 수 있습니다.
일상적인 일에는 그다지 많지 않습니다.
그러나 두 함수에 대한 문서에 따르면 ( ?
함수 이름 앞에 넣고 Enter 키를 누르면 액세스 됨 ) require
경고가 출력되고 패키지를 찾지 못하면 계속되는 동안 함수 내부에서 사용되며 library
오류가 발생합니다.
require
는 패키지를 libraries
R-cognoscenti를 벽으로 몰아 넣는 관행이라고 언급하지 않기 때문 입니다. 는 library
패키지가 앉아 디렉토리 위치입니다.
require
, 하지 않는 한 당신은 반환 값을 확인 (그 경우, 일반적으로 예를 더 나은 대안이있다 loadNamespace
).
또 다른 장점은 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
}
{knitr}, {bookdown} 및 기타 여러 패키지의 저자 인 Yihui Xie 는 다음 과 같이 말합니다 .
신사 숙녀 여러분, 전에 말한 적이 있습니다. require ()는 R 패키지를로드하는 잘못된 방법입니다. 대신 library ()를 사용하십시오.
다른 누구보다 더 인기있는 R 패키지의 저자 인 Hadley Wickham 은 말합니다.
library(x)
데이터 분석 스크립트에서 사용하십시오 . […] 당신 은 사용할 필요가 없습니다require()
(requireNamespace()
거의 항상 좋습니다)
class::function
을 사용 library()
하여 모든 함수를 호출하지 않는 한 정확히 동일하게 가리킬 것 입니다.
?library
당신은 볼 것이다 :
library(package)
그리고require(package)
모두 부하는 이름의 패키지package
및 검색 목록에 넣어.require
다른 기능 내에서 사용하도록 설계되었습니다. 패키지가 존재하지 않으면 (기본적으로FALSE
오류가 아닌) 경고를 반환 하고 제공library()
합니다. 두 기능 모두 현재로드 된 패키지 목록을 확인 및 업데이트하고 이미로드 된 패키지를 다시로드하지 않습니다. (이러한 패키지를 다시로드하려면detach(unload = TRUE)
또는을 호출하십시오unloadNamespace
.) 검색 목록에 패키지를 넣지 않고 패키지를로드하려면을 사용하십시오requireNamespace
.
차이점에 대한 나의 초기 이론은 library
패키지가 이미로드되었는지 여부에 관계없이 패키지 를 로드 한다는 것입니다. 즉, 이미로드 된 패키지를 다시로드 할 수는 있지만 패키지 require
가로드되었는지 확인하거나 그렇지 않은 경우로드 특정 패키지에 의존합니다). 그러나이 문서는 이것을 반박하고, 어떤 함수도 이미로드 된 패키지를 다시로드하지 않을 것이라고 명시합니다.
이미로드 된 패키지의 차이점이있는 것 같습니다. 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과 함께 제공되는 함수는 모두 엉망이다).
loadNamespace
하는 경우 패키지를로드하고 첨부하지 않고 네임 스페이스를 반환하는을 사용할 수 있습니다 .