Requir () ve library () arasındaki fark nedir?


565

Arasındaki fark nedir require()ve library()?



7
Cevap olarak bir sürümünü göndermek istemediği sürece @ Yihui'nin blog yayınına bir bağlantı eklemek. yihui.name/en/2014/07/library-vs-require
MichaelChirico

4
@ Yihui'nin blog yazısı: "Bayanlar ve baylar, bunu daha önce de söyledim: requir () bir R paketi yüklemek için yanlış yoldur; bunun yerine kütüphane () kullanın"
De Novo

1
@DanHall ... çünkü library()hemen yüksek sesle, erken ve ilgili bir hata mesajıyla (paket yüklenmemişse veya yüklenemediyse) başarısız olur, ancak require()bir hata oluşturmazsa, sadece sessizce atılan boole FALSE değerini döndürür, ve kodun Error: object “bar” not found(say) line 175 ile daha sonra ve daha şifreli olarak başarısız olmasına neden olur .
smci

1
@KonradRudolph: Bitti! Geri bildiriminiz için teşekkür ederiz.
Marco

Yanıtlar:


86

Zaten verilen iyi tavsiyeye ek olarak, bunu eklerdim:

Bu kullanımından kaçınmak herhalde en iyisidir require() sürece aslında thierry tarafından verilen bu tür bazı hata denetimi döngüde örneğin döner değeri kullanılarak yapılacaktır.

Diğer çoğu durumda kullanmak daha iyidir library(), çünkü paket mevcut değilse paket yükleme sırasında bir hata mesajı verecektir. require()paket orada değilse, hata olmadan başarısız olacaktır. Bu, paketin yüklenmesi gerekip gerekmediğini öğrenmek için en uygun zamandır (veya yanlış yazıldığından belki de yoktur). Erken ve ilgili zamanda hata geri bildirimi almak, kütüphane rutinlerini kullanmaya çalıştığında sonraki kodun neden başarısız olduğunu izleyerek olası baş ağrılarını önleyecektir.


356

Günlük işlerde bir tane yok.

Bununla birlikte, her iki fonksiyonun belgelerine göre ( ?fonksiyon adından önce a koyarak ve enter'a basarak erişilir ), requirefonksiyonların içinde kullanılır, çünkü bir uyarı verir ve paket bulunmazsa devam eder, librarybir hata atar.


1
#richiemorrisroe: Teşekkür ederim. R-kodumun başında ihtiyacım olan paketleri yüklersem hangisini seçtiğim önemli değil mi?
Marco

6
Bir işlevin içinde paketleri yüklemediğiniz sürece, gerçekten hiçbir fark yaratmaz. Gereksinimi kullanarak tüm paketlerimi yüklüyorum ve sorunuzu gördükten sonra yardımı okuyana kadar farkın ne olduğunu bilmiyordum.
richiemorrisroe

45
Kullanmamın bir diğer nedeni requirede libraries, paketleri paketlere atmaktan alıkoymam. libraryPaketler oturup dizin konumudur.
IRTFM

22
Çok alakalı farklılıkları var. Kullanmayın require, sürece sen dönüş değerini kontrol (ve bu durumda, genellikle örneğin daha iyi alternatifler vardır loadNamespace).
Konrad Rudolph

256

Diğer bir faydası, require()varsayılan olarak mantıksal bir değer döndürmesidir. TRUEpaketler yüklenmişse, FALSEdeğilse.

> 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

Böylece require()aşağıdaki gibi yapılarda kullanabilirsiniz . Kodunuzu R kurulumumuza dağıtmak istiyorsanız hangi paketler yüklü olmayabilir.

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()Paketleri yalnızca ve yalnızca gerekirse yüklemek isterseniz kullanabilirsiniz , örneğin:

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

Birden fazla paket için şunları kullanabilirsiniz:

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

Profesyonel ipuçları:

  • Komut dosyasının içinde kullanıldığında, reposparametresini belirterek bir iletişim kutusu ekranından kaçınabilirsiniz install.packages().

    install.packages(package, repos="http://cran.us.r-project.org")
  • Sen sarar require()ve library()içinde suppressPackageStartupMessages()için de, bastırmak paketin başlangıç mesajları ve ayrıca parametreleri kullanın require(..., quietly=T, warn.conflicts=F)yüklemeleri sessiz tutmak için gerekirse.


46

Her zaman kullanın library. Asla 1 kullanım require.

( 1 Neredeyse asla. Belki .)

Özetle, bunun nedeni, requirekodunuzu kullanırken bir hata sinyali vermeden farklı, hatalı sonuçlar verebilmesidir . Bu nadirdir ancak varsayımsal değildir! {Dplyr} 'in yüklenip yüklenemeyeceğine bağlı olarak farklı sonuçlar veren bu kodu göz önünde bulundurun :

require(dplyr)

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

Bu, oldukça yanlış sonuçlara yol açabilir. Burada kullanmak libraryyerine requirebir hata atar, bir şeylerin yanlış olduğunu açıkça gösterir. Bu iyi .

Ayrıca diğer tüm hataların hata ayıklamasını daha da zorlaştırır: requireKomut dosyanızın başlangıcında bir paket kullanırsanız ve dışa aktarımını 500 satırında kullanırsanız, 500 satırında "nesne 'foo' bulunamadı" hata iletisini alırsınız. hata “'bla' diye bir paket yok”.

Kabul edilebilir tek kullanım durumu require, diğer cevapların bazılarının gösterdiği gibi, dönüş değerinin hemen kontrol edilmesidir. Bu oldukça yaygın bir kalıptır, ancak bu durumlarda bile, varlık kontrolünü ve paketin yüklenmesini ayırmak daha iyidir (ve tavsiye edilir, aşağıya bakın).

Daha teknik olarak, requireaslında librarydahili olarak çağırır (paket önceden eklenmemişse - requirebu nedenle yedekli bir kontrol gerçekleştirir, çünkü paketin zaten yüklü olup olmadığını library da kontrol eder). İşte requirene yaptığını göstermek için basitleştirilmiş bir uygulama :

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
}

Deneyimli R geliştiricileri:

{Knitr}, {bookdown} ve diğer birçok paketin yazarı Yihui Xie şöyle diyor :

Bayanlar ve baylar, bunu daha önce de söyledim: requir () bir R paketi yüklemek için yanlış yoldur; bunun yerine kitaplığı () kullan

Herkesten daha popüler R paketlerinin yazarı Hadley Wickham ,

library(x)Veri analizi komut dosyalarında kullanın . […] Hiç kullanmanıza gerek yok require()( requireNamespace()neredeyse her zaman daha iyidir)


Sözdizimi ile TÜM işlevleri çağırmazsanız class::function, tam olarak aynı noktayı işaretleyecektim, tam olarak bundan library()kaçınmak için kullanın .
Hayalet

19
?library

ve göreceksin:

library(package)ve require(package)her ikisi de paketi adla yükler packageve arama listesine koyar. requirediğer işlevler içinde kullanılmak üzere tasarlanmıştır; paket mevcut değilse geri döner FALSEve library()varsayılan olarak bir hata yerine bir uyarı verir . Her iki işlev de şu anda yüklü paketlerin listesini kontrol eder ve günceller ve önceden yüklenmiş bir paketi yeniden yüklemez. (Böyle bir paketi yeniden yüklemek istiyorsanız, önce arayın detach(unload = TRUE)veya arayın unloadNamespace.) Bir paketi arama listesine koymadan yüklemek istiyorsanız, düğmesini kullanın requireNamespace.


9

Fark hakkındaki ilk teorim library, paketleri önceden yüklenmiş olsun veya olmasın yüklediği, yani zaten yüklenmiş bir paketi yeniden yükleyebileceği, ancak yüklenip yüklenmediğini requirekontrol ettiği veya (eğer işlevlerde kullanımın belirli bir pakete dayanan). Bununla birlikte, belgeler bunu reddeder ve her iki işlevin de önceden yüklenmiş bir paketi yeniden yüklemeyeceğini açıkça belirtir.


18
bu ilginç, ama gerçekten sorunun cevabı değil ...?
Ben Bolker


3

İşte zaten yüklü bir paketteki fark gibi görünüyor. Gereksinim ve kitaplığın paketi yüklemediği doğru olsa da. Kütüphane kontrol edilmeden ve çıkmadan önce birçok şey yapar.

Ben yine de 2mil kez çalışan bir fonksiyonun başlangıcından "gerektirir" kaldırılmasını tavsiye ederim, ama eğer, herhangi bir nedenle tutmak gerekiyordu. teknik olarak daha hızlı bir kontrol gerektirir.

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

Bunun libraryyerine uygulamayı düzeltmek için güçlü bir neden olduğunu iddia ediyorum (şu anda R ile birlikte gönderildiği gibi her iki işlev de büyük bir karışıklıktır).
Konrad Rudolph

@KonradRudolph iyi, eğer birisi kütüphaneyi düzeltirse, belki de versiyona göre yüklemeyi açıkça etkinleştirebilir ve eki bir argüman seçeneği haline getirebilir
Şekil

Evet, kesinlikle katılıyorum ama bunlar sadece performansı değil semantiği değiştirecekti. Her neyse, sürüm oluşturma maalesef R'deki paketlerle asla çalışmayacak. Bunun yerine çalışıyorum (gerçekten!). Eklemeye gelince, loadNamespacebir paketi yükleyen ve ad alanını, eklemeden döndüren kullanabilirsiniz .
Konrad Rudolph
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.