"Imports"
an toàn hơn "Depends"
(và cũng làm cho một gói sử dụng nó trở thành "công dân tốt hơn" đối với các gói khác sử dụng "Depends"
).
Một lệnh "Depends"
cố gắng để đảm bảo rằng một chức năng từ gói khác có sẵn bằng cách đính kèm gói khác vào đường dẫn tìm kiếm chính (tức là danh sách các môi trường được trả về bởi search()
). Tuy nhiên, chiến lược này có thể bị cản trở nếu một gói khác, được tải sau đó, đặt một chức năng có tên giống hệt trước đó trên đường tìm kiếm. Chambers ( trong SoDA ) sử dụng ví dụ về hàm "gam"
, được tìm thấy trong cả gói gam
và mgcv
gói. Nếu hai gói khác được tải, một trong số chúng phụ thuộc gam
và một tùy thuộc vào mgcv
, chức năng được tìm thấy bởi các cuộc gọi gam()
sẽ phụ thuộc vào thứ tự mà hai gói đó được đính kèm. Không tốt.
Một lệnh "Imports"
nên được sử dụng cho bất kỳ gói hỗ trợ nào có chức năng được đặt trong <imports:packageName>
(được tìm kiếm ngay sau đó <namespace:packageName>
), thay vì trên đường dẫn tìm kiếm thông thường. Nếu một trong các gói trong ví dụ trên sử dụng "Imports"
cơ chế (cũng yêu cầu import
hoặc importFrom
chỉ thị trong NAMESPACE
tệp), vấn đề sẽ được cải thiện theo hai cách. (1) Gói sẽ tự kiểm soát mgcv
chức năng nào được sử dụng. (2) Bằng cách giữ cho đường dẫn tìm kiếm chính rõ ràng khỏi các đối tượng được nhập, nó thậm chí sẽ không có khả năng phá vỡ sự phụ thuộc của gói khác vào mgcv
chức năng khác .
Đây là lý do tại sao sử dụng không gian tên là một cách thực hành tốt như vậy, tại sao bây giờ nó được thi hành bởi CRAN và (đặc biệt) tại sao sử dụng lại "Imports"
an toàn hơn sử dụng "Depends"
.
Chỉnh sửa để thêm một cảnh báo quan trọng:
Có một ngoại lệ không may chung cho những lời khuyên ở trên: nếu gói của bạn dựa vào một gói phần mềm A
mà bản thân "Depends"
trên một gói khác B
, gói của bạn có thể sẽ cần phải đính kèm A
với một "Depends
chỉ thị.
Điều này là do các hàm trong gói A
được viết với kỳ vọng rằng gói B
và các hàm của nó sẽ được gắn vào search()
đường dẫn .
Một lệnh "Depends"
sẽ tải và đính kèm gói A
, tại đó chỉ thị A
của chính gói đó "Depends"
, theo phản ứng dây chuyền, sẽ khiến gói B
được tải và đính kèm. Các hàm trong gói A
sau đó sẽ có thể tìm thấy các hàm trong gói B
mà chúng dựa vào.
Một lệnh "Imports"
sẽ tải nhưng không đính kèm gói A
và sẽ không tải cũng không đính kèm gói B
. ( "Imports"
, Sau khi tất cả, hy vọng rằng tác giả gói đang sử dụng cơ chế namespace, và gói phần mềm đó A
sẽ được sử dụng "Imports"
để trỏ đến bất kỳ chức năng trong B
đó cần truy cập vào.) Các cuộc gọi theo chức năng của mình cho bất kỳ chức năng trong gói A
mà dựa vào chức năng trong gói B
di chúc hậu quả là thất bại.
Hai giải pháp duy nhất là:
- Có gói của bạn đính kèm gói
A
bằng cách sử dụng một "Depends"
chỉ thị.
- Về lâu dài, hãy liên hệ với người bảo trì gói hàng
A
và yêu cầu họ thực hiện công việc cẩn thận hơn trong việc xây dựng không gian tên của họ (theo lời của Martin Morgan trong câu trả lời liên quan này ).