2010-02-17 34 views
45

Tất cả,Tổ chức Mã nguồn R

Tôi bắt đầu viết mã R hướng đối tượng lần đầu tiên và dự đoán có nhiều tệp R với phụ thuộc ở giữa. Tôi mới vào R và chưa viết gì ngoài một kịch bản lớn để kiểm tra ý tưởng. Có tài nguyên trực tuyến cung cấp mẹo về cách người ta phải tổ chức mã không? Ngắn của các mô tả về cách xây dựng các gói, tôi không tìm thấy hướng dẫn như vậy. Tại thời điểm này, tôi chỉ muốn tổ chức mã theo cách mà nó làm cho việc tải và tương tác với việc thu thập các thường trình càng đơn giản càng tốt.

Đánh giá cao bất kỳ hướng dẫn nào bạn có thể cung cấp.

Chris

+2

Có thể trùng lặp: http://stackoverflow.com/questions/1266279/how-to-organize-large-r-programs – Shane

Trả lời

41

Câu hỏi này có liên quan rất chặt chẽ với: "How to organize large R programs?"

Bạn nên cân nhắc việc tạo ra một gói R. Bạn có thể sử dụng chức năng package.skeleton để bắt đầu với một tập hợp các tệp R. Tôi cũng khuyên bạn nên sử dụng roxygen để ghi lại gói ngay từ đầu vì sẽ khó thực hiện hơn sau khi thực tế.

Đọc "Writing R Extensions". Cuốn sách trực tuyến "Thống kê với R" có a section on this subject. Ngoài ra hãy xem Creating R Packages: A Tutorial bởi Friedrich Leisch. Cuối cùng, nếu bạn đang ở NY, hãy đến cuộc họp nhóm sử dụng NY sắp tới tại số "Authoring R Packages: a gentle introduction with examples".

Chỉ cần rehash một số gợi ý về thực tiễn tốt:

  • Một gói cho phép bạn sử dụng R CMD check mà là rất hữu ích trong việc bắt lỗi; riêng bạn có thể xem bằng cách sử dụng gói codetools.
  • Một gói cũng buộc bạn phải thực hiện một số lượng tài liệu tối thiểu, dẫn đến thực tiễn tốt hơn về lâu dài.
  • Bạn cũng nên cân nhắc thực hiện kiểm tra đơn vị (ví dụ: RUnit) nếu bạn muốn mã của mình mạnh mẽ/bảo trì.
  • Bạn nên cân nhắc sử dụng hướng dẫn kiểu (ví dụ: Google Style Guide).
  • Sử dụng hệ thống kiểm soát phiên bản ngay từ đầu và nếu bạn định tạo mã nguồn mở, hãy xem xét sử dụng github hoặc r-forge.

Edit:

Về làm thế nào để thực hiện thay đổi gia tăng mà không cần xây dựng lại và cài đặt trọn gói: Tôi tìm thấy những điều đơn giản nhất để làm là để thực hiện thay đổi trong tập tin R có liên quan của bạn và sau đó sử dụng lệnh source để tải những thay đổi đó. Khi bạn tải thư viện của mình vào một phiên R, nó sẽ luôn thấp hơn trong môi trường (và thấp hơn mức ưu tiên) so với .GlobalEnv, vì vậy mọi thay đổi mà bạn nguồn hoặc tải trực tiếp sẽ được sử dụng trước tiên (sử dụng lệnh search để xem điều này). Bằng cách đó bạn có thể có gói của bạn cơ bản và bạn đang ghi đè lên những thay đổi khi bạn đang thử nghiệm chúng trong môi trường.

Hoặc, bạn có thể sử dụng IDE như Statet hoặc ESS. Họ làm cho tải dòng cá nhân hoặc chức năng ra khỏi một gói R rất dễ dàng. Statet được thiết kế đặc biệt tốt để xử lý các gói quản lý trong cấu trúc giống như thư mục.

+0

Cảm ơn Shane. Chính xác hướng dẫn mà tôi đang tìm kiếm. – Chris

+1

Vì vậy, đây là một câu hỏi khác xuất hiện trong cuộc thảo luận SO mà bạn đã tham chiếu chưa được trả lời. Khi bạn đang sửa đổi/thêm mã vào gói đang phát triển, làm cách nào để bạn tải lại nội dung gói mà không phải trải qua quá trình cài đặt? Có cách nào thuận tiện không? Chỉ cần cố gắng để có được một xử lý trên một chu kỳ là đi qua khi bạn viết mã và thử nghiệm. – Chris

+3

Nhìn vào hàm "sourceDir" nằm trong phần ví dụ của tệp trợ giúp cho hàm "nguồn" (gõ "? Source" tại dấu nhắc commnand R). Tôi có một chức năng rất giống trong tập tin ~/.Rprofile của tôi, và tôi sourceDir() thư mục mypackage/R của gói mà tôi đang xây dựng khi tôi thay đổi nó. Thỉnh thoảng tôi sẽ cài đặt lại gói, nhưng tôi thấy cách này dễ dàng hơn để thực hiện các thay đổi gia tăng khi thổi bay bất kỳ công việc hiện tại nào tôi đang thực hiện trong trình thông dịch. –

0

điều này là vì lợi ích của những người khác được chuyển hướng đến bài đăng này khi họ tìm kiếm. Tôi cũng phải đối mặt với cùng một kịch bản và không tìm thấy tài nguyên nào giải thích rõ ràng. Đây là nỗ lực của tôi để đưa giải pháp trong một vài bước đơn giản:
1) Tạo một thư mục dự án mới
2) Tạo một gói qua phòng thu R (cùng quy trình như trên)
3) Giữ cả hai trong cùng một vị trí (để tránh nhầm lẫn).
4) Cài đặt và tải gói: devtools và roxygen2.
5) sử dụng hàm load_all().

Và bạn đã hoàn tất.

+0

chức năng '' 'load_all()' '' là gì? –

+0

load_all tải một gói. Nó gần như mô phỏng những gì xảy ra khi gói được cài đặt và được tải bằng thư viện –