2013-03-06 6 views
10

Czy występują jakieś niepożądane skutki, włączając w to funkcje library/require w funkcjach, które będą wywoływane bardzo często?Jaki jest wpływ wymaganego pakietu wewnątrz funkcji, jeśli pakiet jest już załadowany?

Czas używany wydaje się raczej pomijalny, ale wywołuję tę funkcję co kilka minut i zastanawiam się, czy jest jakaś wada do wywołań repetitve require?
Zwróć uwagę, że funkcja ta jest tylko narzędziem osobistym i nie jest udostępniana. tj. ja jestem jedynym użytkownikiem, który go używa

Nawiasem mówiąc, jakikolwiek wgląd w to, dlaczego library jest w połowie tak wolny jak require? Miałem wrażenie, że są synonimami.

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

jeśli jesteś jedyną osobą, używając go, dlaczego nie usunąć wymagać/Library i nazywają to poza funkcją? taht powiedział, Wewnątrz funkcji użyłbym 'require' ponieważ zwraca ostrzeżenia, a nie błąd – agstudy

+4

Czy różnica prędkości miałaby coś wspólnego z' biblioteką' niewidocznie zwracającą listę dostępnych pakietów, podczas gdy 'require' właśnie zwraca logiczną' TRUE/FALSE'? Po prostu przeczytałem to w '? Library', ale nie jestem ekspertem w tym temacie. – thelatemail

+4

Zła praktyka używania' library() 'lub' require() 'wewnątrz funkcji, ponieważ sprawia, że ​​trudno jest powiedzieć jaki pakiet potrzebuje kod. Powinny one być ou tside lub w opakowaniu OPIS. Nie martwiłbym się zbytnio implikacjami związanymi z wydajnością (a jeśli zrobiłeś 'microbenchmark' dostarczysz lepsze dane do kontynuowania). – hadley

Odpowiedz

10

require sprawdza, czy pakiet jest już załadowane (na ścieżce wyszukiwania)

wykorzystujące

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

i przystąpi tylko z załadunkiem to, czy jest to FALSE

library zawiera podobny test, ale robi trochę więcej stuff, gdy jest to PRAWDA (w tym tworzenie listy ailable pakiety.

require postępuje, używając wywołania tryCatch do biblioteki i utworzy komunikat.

Więc jedno wezwanie do library lub require gdy pakiet nie znajduje się na ścieżce wyszukiwania może skutkować library jest szybsze

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 

Ale, jeśli pakiet jest już załadowany, a następnie jak pokazać, require jest szybszy, ponieważ nie robi dużo więcej niż sprawdza, czy pakiet jest załadowany.

Najlepszym rozwiązaniem byłoby, aby stworzyć mały pakiet, który importuje stringr (lub przynajmniej str_extract z stringr

+0

(+1) Różnica między nimi nie jest jednak tak duża. Jest to około 0,01 sekundy na moim laptopie. A 'require' czasami ładuje się szybciej niż' biblioteka'. – Arun

+1

@Arun --- interesujące. Swoje stwierdzenie zakwalifikowałem do "* może * spowodować, że biblioteka będzie szybsza" – mnel

Powiązane problemy