2011-12-05 35 views
12

Tôi có nhiều hoặc ít cài đặt sau đây. Trong ~/path/to/my/packages Tôi có hai gói package1.mpackage2.m. phác thảo của mỗi gói được, ví dụ như sau:Tải gói toán học từ trong một gói

BeginPackage["package1`"] 
[email protected]@Names["package1`*"]; 
[email protected]@Names["package1`*"]; 

Begin["`Private`"] 

vecNorm[vec_?VectorQ]:=Module[{},Return[Sqrt[vec.vec]]]; 

End[] 
[email protected]@Names["package1`*"]; 
EndPackage[] 

Bây giờ, vấn đề của tôi là tôi muốn sử dụng vecNorm quy định tại package1.m trong package2.m. Làm cách nào để tải (an toàn) package1 từ trong vòng package2?

Tại thời điểm này, tôi nạp bằng tay cả gói như sau:

SetDirectory[StringJoin[NotebookDirectory[], "packages"]]; 
Needs["package1`"] 
Needs["package2`"] 

từ một máy tính xách tay được lưu trong ~/path/to/my. Tôi chỉ muốn tải theo cách thủ công chỉpackage2 lần lượt sẽ tải tự động và an toàn package1. Nói chung tôi muốn một giải pháp mà thay đổi ít nhất là có thể đường dẫn vv của mathematica. Nên thực hành tốt nhất để thực hiện điều này là gì?

PS: Bằng một cách an toàn Tôi có nghĩa là trong tương lai, khi tôi sẽ xác định package3 mà sẽ được sử dụng vecNorm cũng và sẽ được tải package1 cũng không có xung đột sẽ xảy ra.

Trả lời

13

Có hai cách được khuyến nghị chung để tải gói. Một là cái gọi là nhập khẩu công cộng, và trong việc thiết của bạn nó sẽ được thực hiện như

BeginPackage["package2`",{"package1`"}] 

(* Usage messages etc *) 

Begin["`Private`"] 

(* code here *) 

End[] 
EndPackage[] 

Ở đây, bạn cho biết tên bối cảnh của gói bạn muốn tải, trong danh sách mà là một đối số tùy chọn thứ hai để BeginPackage . Cách nhập này được gọi là công khai vì gói đã tải sẽ vẫn nằm trên $ContextPath sau khi gói chính của bạn được tải và do đó sẽ được cung cấp công khai.

Phương pháp thứ hai được gọi là nhập khẩu tư nhân, và được sơ đồ thực hiện như

BeginPackage["package2`"] 

(* Usage messages etc *) 

Begin["`Private`"] 
Needs["package1`"] 

(* code here *) 

End[] 
EndPackage[] 

Trong phương pháp này, gói thứ hai tải của bạn sẽ chỉ có sẵn cho các gói phần mềm đó tải nó (với Needs), do đó nhập khẩu tin .

Cách nào bạn cần sẽ tùy thuộc vào tình huống. Tôi cố gắng để làm cho tất cả các hàng nhập khẩu của tôi tư nhân trừ khi tôi phải làm cho chúng công khai. Tuy nhiên, để gỡ lỗi, trước tiên bạn có thể thực hiện nhập công khai trước khi bạn có thể chơi với gói thứ hai trực tiếp ở cấp cao nhất.

Vì sự an toàn, bạn có thể tải gói hàng bằng bất kỳ số lượng gói nào và điều này sẽ an toàn. Khi bạn tải nhiều gói vào cùng một ngữ cảnh cùng một lúc, điều này sẽ được an toàn miễn là các gói đó không có biểu tượng công khai có cùng tên ngắn. Nếu không, bạn sẽ chạy vào cái được gọi là vấn đề về bóng tối, nhưng tốt nhất là hãy nỗ lực để tránh điều đó (luôn luôn có thể).

+0

Phương pháp đầu tiên của bạn đã giải quyết được vấn đề của tôi! Cảm ơn. Đối với lần thứ hai, khi thử nó, có vẻ như có vấn đề với đường dẫn tìm kiếm và 'package1' không quản lý để tìm' package2'. - Tôi đã tự mình thử tùy chọn này và nó không hoạt động. – Dror

+2

@Dror Phương pháp thứ hai sẽ hoạt động tốt. Nếu không, điều này có nghĩa là bạn đặt gói thứ hai của bạn ở đâu đó mà Mathematica không thể tìm thấy nó. Sau đó, bạn nên di chuyển các gói của mình đến một nơi mà M có thể tìm thấy chúng (ví dụ: '$ UserBaseDirectory') hoặc thêm thư mục chứa các gói của bạn vào biến' $ Path'.Trên thực tế, cả hai phương thức nhập đều hoạt động hoặc cả hai đều không thành công, vì vậy tôi hơi bối rối trước tình huống của bạn. –

+0

Tôi muốn một giải pháp miễn phí từ các đường dẫn có thể thay đổi, vì tất cả điều này nằm trong một thư mục được chia sẻ và tôi không biết cài đặt của các cộng tác viên của tôi là gì. Thật vậy, có vẻ như phương pháp thứ hai không tìm thấy gói cơ bản. Tôi chắc chắn bối rối; nhưng hạnh phúc là có một giải pháp :) – Dror

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