"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 gamvà mgcvgói. Nếu hai gói khác được tải, một trong số chúng phụ thuộc gamvà 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 importhoặc importFromchỉ thị trong NAMESPACEtệp), vấn đề sẽ được cải thiện theo hai cách. (1) Gói sẽ tự kiểm soát mgcvchứ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 mgcvchứ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 Amà 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 Avới một "Dependschỉ 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 Bvà 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ị Acủ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 Asau đó sẽ có thể tìm thấy các hàm trong gói Bmà chúng dựa vào.
Một lệnh "Imports"sẽ tải nhưng không đính kèm gói Avà 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 đó Asẽ đượ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 Amà dựa vào chức năng trong gói Bdi 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
Abằ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
Avà 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 ).