2013-03-06 29 views
10

Ci sono degli effetti negativi sull'inclusione delle istruzioni library/require all'interno di funzioni che verranno chiamate molto frequentemente?Qual è l'impatto di richiedere un pacchetto all'interno di una funzione se il pacchetto è già stato caricato?

Il tempo utilizzato sembra piuttosto trascurabile, ma sto chiamando la funzione ogni pochi minuti e mi chiedo se non vi è alcun svantaggio per le chiamate ripetute require?
nota che la funzione è solo un utile personale e non viene condivisa. cioè, io sono l'unico che lo usa

Per inciso, qualsiasi intuizione sul motivo per cui library è mezzo lento come require? Avevo l'impressione che fossero sinonimi.

WithREQUIRE <- function(x) { 
    require(stringr) 
    str_detect(x, "hello") 
    } 

    WithLIBRARY <- function(x) { 
    library(stringr) 
    str_detect(x, "hello") 
    } 

    Without <- function(x) { 
    str_detect(x, "hello") 
    } 

    x <- "goodbye" 

    library(rbenchmark) 
    benchmark(WithREQUIRE(x), WithLIBRARY(X), Without(x), replications=1e3, order="relative") 

    #   test replications elapsed relative user.self sys.self 
    #  Without(x)   1000 0.592 1.000  0.262 0.006 
    # WithREQUIRE(x)   1000 0.650 1.098  0.295 0.015 
    # WithLIBRARY(X)   1000 1.359 2.296  0.572 0.024 
+1

se sei l'unica persona che lo utilizza, perché non rimuovere richiedere/biblioteca e lo chiamano fuori della funzione? ho detto, all'interno di una funzione userei 'require' perché restituisce un avviso non un errore – agstudy

+4

La differenza di velocità ha a che fare con' library' che restituisce in modo invisibile un elenco di pacchetti disponibili mentre 'require' restituisce un valore logico' TRUE/FALSE'? Ho appena letto in '? Library', ma non sono esperto su questo argomento. – thelatemail

+4

È una pratica sbagliata usare' library() 'o' require() 'all'interno di una funzione, perché rende difficile dire quali sono i codici dei pacchetti necessari. Dovrebbero essere ou tside o nella confezione DESCRIZIONE. Non mi preoccuperei molto delle implicazioni in termini di prestazioni (e se hai fatto "microbenchmark" fornisci dati migliori per andare avanti). – hadley

risposta

10

require verifica se il pacchetto è già caricato (sul percorso di ricerca)

utilizzando

loaded <- paste("package", package, sep = ":") %in% search() 

e procederà unicamente con carico se questo è FALSE

library include un test simile, ma fa un po 'di più stuff quando questo è VERO (compresa la creazione di un elenco di pacchetti disponibili.

require procede utilizzando una chiamata tryCatch alla libreria e creerà un messaggio.

Così una singola chiamata a library o require quando un pacchetto non si trova sul percorso di ricerca può comportare library essere più veloce

system.time(require(ggplot2)) 
## Loading required package: ggplot2 
## user system elapsed 
## 0.08 0.00 0.47 
detach(package:ggplot2) 
system.time(library(ggplot2)) 
## user system elapsed 
## 0.06 0.01 0.08 

Ma, se il pacchetto è già caricato, poi come si mostra, require è più veloce perché non fa molto di più che controllare che il pacchetto sia caricato.

La soluzione migliore sarebbe quella di creare un piccolo pacchetto che importa stringr (o almeno str_extract da stringr

+0

(+1) Tuttavia, la differenza tra i due non è così alta. È nell'ordine di 0,01 secondi sul mio portatile. E 'require' a volte carica più velocemente di' library'. – Arun

+1

@Arun --- interessante. Ho qualificato la mia istruzione su "* may * risultato che la libreria è più veloce" – mnel

Problemi correlati