"Imports"
ปลอดภัยกว่า"Depends"
(และทำให้แพ็คเกจที่ใช้เป็น 'พลเมืองที่ดีขึ้น' เมื่อเทียบกับแพ็คเกจอื่น ๆ ที่ใช้งาน"Depends"
)
"Depends"
พยายามสั่งเพื่อให้มั่นใจว่าการทำงานจากแพคเกจอื่นสามารถใช้ได้โดยการติดตั้งแพคเกจอื่น ๆ ไปยังเส้นทางการค้นหาหลัก (เช่นรายการของสภาพแวดล้อมที่ส่งกลับโดยsearch()
) อย่างไรก็ตามกลยุทธ์นี้สามารถป้องกันได้หากมีการโหลดแพคเกจอื่นในภายหลังวางฟังก์ชันที่มีชื่อเหมือนกันก่อนหน้านี้บนเส้นทางการค้นหา Chambers ( ใน SoDA ) ใช้ตัวอย่างของฟังก์ชัน"gam"
ซึ่งพบได้ทั้งในgam
และmgcv
แพ็คเกจ หากมีการโหลดแพ็กเกจอื่นสองแพคเกจหนึ่งแพ็กเกจนั้นขึ้นอยู่กับแพ็กเกจที่gam
ขึ้นอยู่กับmgcv
ฟังก์ชั่นที่พบโดยการเรียกไปยังgam()
จะขึ้นอยู่กับลำดับที่แนบแพ็กเกจทั้งสอง ไม่ดี.
"Imports"
สั่งควรจะใช้สำหรับแพคเกจการสนับสนุนใด ๆ ที่มีฟังก์ชั่นจะถูกวางไว้ใน<imports:packageName>
(สืบค้นทันทีหลังจาก<namespace:packageName>
) แทนในเส้นทางการค้นหาปกติ หากหนึ่งในแพ็กเกจในตัวอย่างด้านบนใช้"Imports"
กลไก (ซึ่งจำเป็นต้องมีimport
หรือimportFrom
คำสั่งในNAMESPACE
ไฟล์) เรื่องต่างๆจะได้รับการปรับปรุงในสองวิธี (1) แพ็คเกจจะได้รับการควบคุมว่าmgcv
จะใช้ฟังก์ชันใด (2) โดยการรักษาเส้นทางการค้นหาหลักที่ชัดเจนของวัตถุที่นำเข้ามันจะไม่ได้ทำลายการพึ่งพาแพคเกจอื่น ๆ ในmgcv
ฟังก์ชั่นอื่น ๆ
นี่คือเหตุผลที่ใช้ namespaces เป็นวิธีที่ดีดังกล่าวว่าทำไมมันจะถูกบังคับใช้ในขณะนี้โดย CRAN และ (โดยเฉพาะอย่างยิ่งใน) ว่าทำไมการใช้จะปลอดภัยกว่าการใช้"Imports"
"Depends"
แก้ไขเพื่อเพิ่มข้อแม้ที่สำคัญ:
มีข้อยกเว้นอย่างหนึ่งที่พบได้ทั่วไปในคำแนะนำข้างต้น: หากแพ็คเกจของคุณใช้แพ็คเกจA
ที่"Depends"
อยู่ในแพ็คเกจอื่นแพ็คเกจB
ของคุณอาจจำเป็นต้องแนบมาA
พร้อมกับ"Depends
คำสั่ง
เพราะนี่คือฟังก์ชั่นในแพคเกจA
ที่ถูกเขียนขึ้นด้วยความคาดหวังว่าแพคเกจB
และหน้าที่ของตนจะได้รับการติดอยู่กับsearch()
เส้นทาง
"Depends"
สั่งจะโหลดและแนบแพคเกจA
ที่จุดแพคเกจA
ของตัวเอง"Depends"
สั่งจะในปฏิกิริยาลูกโซ่, แพคเกจสาเหตุB
ที่จะโหลดและติดอยู่เช่นกัน ฟังก์ชั่นในแพ็คเกจA
จะสามารถค้นหาฟังก์ชั่นในแพ็คเกจB
ที่พวกเขาพึ่งพาได้
"Imports"
สั่งจะโหลด แต่ไม่ได้แนบแพคเกจA
และจะไม่โหลดมิได้B
แนบแพคเกจ ( "Imports"
หลังจากทั้งหมดคาดว่านักเขียนแพคเกจที่มีการใช้กลไก namespace และแพคเกจที่A
จะใช้"Imports"
ในการชี้ไปที่ฟังก์ชั่นใด ๆ ในB
การที่จะต้องเข้าถึง.) โทรโดยฟังก์ชั่นของคุณเพื่อฟังก์ชั่นใด ๆ ในแพคเกจA
ที่พึ่งพาฟังก์ชั่นในแพคเกจB
ประสงค์ จึงล้มเหลว
โซลูชันที่สองเท่านั้นคือ:
- ให้แพ็คเกจของคุณแนบแพ็คเกจ
A
โดยใช้"Depends"
คำสั่ง
- ดีกว่าในระยะยาวติดต่อผู้ดูแลบรรจุภัณฑ์
A
และขอให้พวกเขาทำงานอย่างระมัดระวังมากขึ้นในการสร้างเนมสเปซของพวกเขา (ในคำพูดของ Martin Morgan ในคำตอบที่เกี่ยวข้องนี้ )