Luôn luôn sử dụng library
. Không bao giờ 1 lần sử dụng require
.
( 1 Hầu như không bao giờ. Có lẽ .)
Tóm lại, điều này là do, khi sử dụng require
, mã của bạn có thể mang lại kết quả sai, khác nhau, mà không báo hiệu lỗi . Điều này là hiếm nhưng không phải là giả thuyết! Xem xét mã này, mang lại kết quả khác nhau tùy thuộc vào việc {dplyr} có thể được tải hay không:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
Điều này có thể dẫn đến kết quả sai tinh tế. Sử dụng library
thay vì require
ném một lỗi ở đây, báo hiệu rõ ràng rằng có gì đó không đúng. Điều này là tốt .
Nó cũng làm cho việc gỡ lỗi tất cả các lỗi khác trở nên khó khăn hơn: Nếu bạn require
đóng gói khi bắt đầu tập lệnh của mình và sử dụng bản xuất của nó trong dòng 500, bạn sẽ nhận được thông báo lỗi đối tượng 'foo' không tìm thấy trong dòng 500, thay vì một lỗi không có gói gọi là 'bla'.
Trường hợp sử dụng duy nhất được chấp nhận require
là khi giá trị trả về của nó được kiểm tra ngay lập tức, như một số câu trả lời khác hiển thị. Đây là một mẫu khá phổ biến nhưng ngay cả trong những trường hợp này, tốt hơn là (và được khuyến nghị, xem bên dưới) để thay vào đó tách biệt kiểm tra tồn tại và tải gói.
Về mặt kỹ thuật hơn, require
thực sự gọi library
nội bộ (nếu gói chưa được đính kèm - require
do đó thực hiện kiểm tra dự phòng, vì library
cũng kiểm tra xem gói đã được tải chưa). Đây là một triển khai đơn giản hóa require
để minh họa những gì nó làm:
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
}
Các nhà phát triển R có kinh nghiệm đồng ý:
Yihui Xie , tác giả của {đanr}, {bookdown} và nhiều gói khác nói :
Thưa quý vị, tôi đã nói điều này trước đây: Yêu cầu () là cách sai để tải gói R; sử dụng thư viện () thay thế
Hadley Wickham , tác giả của các gói R phổ biến hơn bất kỳ ai khác, nói
Sử dụng library(x)
trong các kịch bản phân tích dữ liệu. [V]] Bạn không bao giờ cần sử dụng require()
( requireNamespace()
hầu như luôn luôn tốt hơn)