2013-03-06 30 views
10

Có bất kỳ tác động bất lợi nào để bao gồm các tuyên bố library/require bên trong các chức năng sẽ được gọi rất thường xuyên không?Whats tác động của việc yêu cầu một gói bên trong một hàm nếu gói đó đã được nạp?

Thời gian sử dụng có vẻ khá cẩu thả, nhưng tôi gọi chức năng vài phút một lần và tôi tự hỏi liệu có bất kỳ nhược điểm nào đối với các cuộc gọi lặp lại require không?
lưu ý rằng chức năng này chỉ là một ứng dụng cá nhân và không được chia sẻ. tức là, tôi là người duy nhất sử dụng nó

Ngẫu nhiên, bất kỳ thông tin chi tiết nào về lý do tại sao library là một nửa chậm như require? Tôi đã được ấn tượng rằng họ đã đồng nghĩa.

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

nếu bạn là người duy nhất sử dụng nó, Tại sao không để loại bỏ yêu cầu/thư viện và gọi nó là ngoài chức năng? taht đã nói, bên trong một hàm tôi sẽ sử dụng 'require' vì nó trả về một cảnh báo không phải là lỗi. – agstudy

+4

Liệu sự khác biệt tốc độ có liên quan đến' thư viện' không trả về danh sách các gói có sẵn trong khi 'require' chỉ trả về giá trị hợp lý' TRUE/FALSE'? Tôi chỉ đọc trong thư viện ', nhưng không có chuyên gia về chủ đề này. – thelatemail

+4

Thực hành không tốt là sử dụng' library() 'hoặc' require() 'bên trong một hàm, bởi vì nó khó mà nói được những gì gói mã nhu cầu.Họ nên hoặc là ou tside hoặc trong gói DESCRIPTION. Tôi sẽ không lo lắng quá nhiều về các hàm ý hiệu suất (và nếu bạn đã làm 'microbenchmark' cho bạn dữ liệu tốt hơn để tiếp tục). – hadley

Trả lời

10

require kiểm tra xem gói đã được nạp (trên con đường tìm kiếm)

sử dụng

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

và sẽ chỉ tiến hành với tải nó nếu đây là FALSE

library bao gồm một thử nghiệm tương tự, nhưng thực hiện nhiều hơn một chút stuff khi điều này là TRUE (bao gồm việc tạo danh sách av gói.

require tiến hành sử dụng cuộc gọi tryCatch vào thư viện và sẽ tạo một thông báo.

Vì vậy, một cuộc gọi duy nhất để library hoặc require khi một gói không nằm trên con đường tìm kiếm có thể dẫn đến library là nhanh hơn

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 

Nhưng, nếu gói đó đã được nạp, sau đó khi bạn thấy, require là nhanh hơn vì nó không làm nhiều hơn kiểm tra gói được tải.

Giải pháp tốt nhất là để tạo ra một gói nhỏ mà nhập khẩu stringr (hoặc ít nhất str_extract từ stringr

+0

(+1) Tuy nhiên, sự khác biệt giữa hai không cao. Theo thứ tự 0,01 giây trên máy tính xách tay của tôi. Và 'require' đôi khi tải nhanh hơn' thư viện'. – Arun

+1

@Arun --- thú vị. Tôi đã đủ điều kiện tuyên bố của mình cho "* có thể * dẫn đến thư viện nhanh hơn" – mnel

Các vấn đề liên quan