2013-09-03 37 views
18

Khi phát triển gói trong R tất cả R tệp nguồn được đặt trong thư mục con R/ và tất cả mã được biên dịch được đặt trong thư mục con src/.Tổ chức mã trong phát triển gói R

Tôi muốn thêm một số tổ chức vào các tệp trong các thư mục này, thay vì có mọi thứ được bán ở cấp cao nhất. Ví dụ: giả sử tôi đang giả định phát triển ứng dụng máy khách-máy chủ. Về mặt logic, tôi muốn tổ chức tất cả các tệp nguồn R khách hàng của tôi trong R/client/ và tất cả các tệp nguồn máy chủ R của tôi trong R/server/.

Có thể sắp xếp mã trong các thư mục con khi phát triển một gói hay không và nếu có thì làm cách nào? Sổ tay Writing R Extensions không cung cấp bất kỳ hướng dẫn nào, cũng như không phát hiện các tệp được lưu trữ trong các thư mục con dưới R/.

+3

Bạn có thể tạo ra hai gói - một cho khách hàng và một cho máy chủ. –

+4

Tôi có thể, nhưng đó không thực sự là quan điểm của tôi. –

Trả lời

7

Bạn không thể sử dụng thư mục con mà không cần thiết lập bổ sung (như định nghĩa tệp tùy chỉnh). Điều tốt nhất bạn có thể làm là sử dụng các tiền tố: client-a.r, client-b.r, server-a.r, server-b.r vv

+2

** Nhưng tất nhiên bạn có thể **. Nếu bạn biết những gì bạn đang làm, và sẵn sàng thực hiện các tác vụ chính xác của 'src/Makevars'. Ví dụ chính có thể là gói [Ma trận] (http://cran.r-project.org/package=Matrix) có năm (5) thư mục con bên dưới 'src /', và một số trong đó bao gồm các thư mục khác. Bây giờ, đây có phải là phương pháp được đề nghị hay không. Không, nhưng nó a) khả thi và b) đang được thực hiện. –

+3

@DirkEddelbuettel Tất nhiên bạn có thể làm bất cứ điều gì nếu bạn cố gắng hết sức. Bạn thậm chí có thể lưu trữ tất cả các mã trong một cơ sở dữ liệu. – hadley

+0

Không, bạn không thể làm CRAN sẽ không chấp nhận cơ sở dữ liệu. Nhưng nó chấp nhận các gói với các thư mục con. –

9

Mở rộng bình luận cho IMHO câu trả lời sai của Hadley:

Nhìn vào Matrix gói (được viết bởi các thành viên R Core) mà có năm thư mục bên dưới src/ và hai thư mục này chứa các thư mục con khác. Ví dụ khác là các gói Rsymphony (đồng) được viết và duy trì bởi một thành viên R Core.

Làm điều này không dành cho những người yếu tim. R mạnh thích src/Makevars đoạn trên toàn bộ src/Makefile để có thể xây dựng các phiên bản Makefile riêng cho các kiến ​​trúc phụ khác nhau. Nhưng nếu bạn biết một chút làm và sẵn sàng đặt nỗ lực vào, điều này hoàn toàn có thể thực hiện được - và đang được thực hiện.

Điều đó vẫn không làm cho nó được đề xuất mặc dù.

+1

bạn có thể đặt các thư mục con bên dưới 'src /', nhưng bạn có thể đặt chúng bên dưới 'R /' không? Dường như với tôi đó là một sự khác biệt nhỏ nhưng quan trọng ... –

+0

Đối với 'R/'bạn không thể; chúng được thu thập/phân tích cú pháp và được lưu trữ ở định dạng nội bộ. Đối với 'src /' bạn có thể, với một số (đáng kể) đau. –

+0

Chỉ cần thêm mã lưu trữ trong các thư mục con vào 'R /' và tự thêm các tệp vào trường 'Collate:' trong tệp 'DESCRIPTION' cũng không hoạt động. –

1

Nhận biết chuỗi là một chút cũ, tôi chỉ nghĩ rằng tôi sẽ ném vào giải pháp của mình cho vấn đề này. Lưu ý rằng vấn đề của tôi là tương tự, nhưng tôi chỉ quan tâm đến việc bảo tồn hệ thống phân cấp thư mục trong quá trình phát triển.

Khi phát triển, tôi tổ chức các tệp kịch bản trong các thư mục con thành nội dung trái tim, nhưng thay vì chống lại hệ phân cấp phẳng của R trong sản xuất, tôi đã thêm "hằng số biên dịch" của riêng mình.

Đó là, trong tất cả các file nằm trong một thư mục con (không có trong kịch bản top-level /), tôi thêm như sau:

if (!exists("script.debug")) 
    script.debug = FALSE 

Sau đó, tôi tải bất cứ phụ thuộc khác được yêu cầu như sau:

source.list <- c(
      "script_1.R", 
      "script_2.R", 
      "script_3.R", 
      "script_4.R" 
      ) 

if (script.debug) 
    source.list <- paste("./script_subfolder/", source.list, sep="") 

lapply(source.list, source) 

Giả định mặc định là mã đang được sản xuất, (source.debug = FALSE), do đó khi phát triển, chỉ cần đảm bảo source.debug = TRUE và tập lệnh/thư mục của dự án được đặt làm thư mục làm việc trước tải bất kỳ tệp tập lệnh nào. Tất nhiên, ví dụ này là một chút đơn giản - nó giả định rằng tất cả các phụ thuộc tập lệnh tồn tại trong cùng một thư mục, nhưng có vẻ như một vấn đề đơn giản để tạo ra một hệ thống phù hợp với hệ thống phân cấp thư mục phát triển phức tạp hơn.

0

Tôi đã lập luận với nhóm lõi R [Cho phép các thư mục con trong thư mục "gói/R /"] [https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17258]. Họ dường như không thực sự muốn cải thiện nó. Vì vậy, quy trình làm việc của tôi như sau.

1) Tạo một dự án R giống như các gói khác nhưng cho phép thư mục con trong thư mục R/ như

R/mcmc/a.R R/mcmc/b.R R/prediction/p1.R R/predection/p2.R

2) Khi tôi cần để đóng gói họ, tôi chuyển đổi tất cả các file dưới R/ như

R/mcmc_a.R R/mcmc_b.R R/prediction_p1.R R/predection_p2.R ...

3) Sau đó, tôi cài đặt phiên bản phẳng để R.

Tôi đã viết một kịch bản đơn giản cho Linux để làm tất cả mọi thứ

https://github.com/feng-li/flutils/blob/master/inst/bin/install.HS

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