2012-03-01 15 views
27

Gói R Tôi đang phát triển yêu cầu một số đối tượng dữ liệu R, chẳng hạn như các mô hình và thông số được tính toán trước.Làm thế nào để bạn xử lý dữ liệu R bên trong một gói?

Hiện tại tôi có từng đối tượng trong thư mục 'dữ liệu' của gói trong các tệp .RData riêng lẻ. Khi sử dụng gói người dùng có thể sử dụng chức năng "dữ liệu" để đính kèm các đối tượng này vào môi trường của họ.

Hành vi tôi muốn thay thế sẽ là khi tải gói, các đối tượng dữ liệu được tự động đính kèm vào môi trường gói nội bộ và không thể truy cập trực tiếp vào người dùng.

Sự hiểu biết của tôi là việc đặt tệp 'sysdata.rda' trong thư mục 'R' của gói chứa các đối tượng hiện có trong 'dữ liệu' sẽ cho tôi kết quả mong muốn. Tuy nhiên, có cách nào để làm điều này để tôi có thể có từng đối tượng trong một tệp riêng biệt thay vì được nhóm lại với nhau không?

+0

Tại sao đặt từng đối tượng trong một tệp riêng biệt, tại sao không tham chiếu từng đối tượng riêng biệt? Ví dụ: 'packagename ::: a' và' packagename ::: b'. –

+0

@the_skua Các tệp riêng biệt hữu ích để quản lý phiên bản tệp dễ dàng hơn trong gói. Điều này đã được một thời gian trước đây, nhưng tôi nghĩ rằng tôi đã có mô hình khác nhau phù hợp như là một phần của gói và đôi khi chúng tôi muốn cập nhật một trong những nhưng không phải tất cả chúng. – Nixuz

Trả lời

9

Bạn có thể sử dụng móc .onLoad() để gọi data() khi gói của bạn đang được tải và chỉ định không gian tên gói làm môi trường nơi tải các đối tượng dữ liệu vào.

Giả sử bạn có file model1.Rmydata.RData trong data/ thư mục của gói của bạn được gọi foopkg, xác định các chức năng

.onLoad <- function(libname, pkgname) { 
    data("model1", "mydata", package=pkgname, envir=parent.env(environment())) 
} 

nơi nào đó trong gói của bạn (ví dụ trong foopkg-package.R).

Sau khi xây dựng và lắp đặt trọn gói,

> library(foopkg) 
> ls(loadNamespace("foopkg")) 

nên chứng tỏ rằng các đối tượng dữ liệu khác nhau đã được nạp thành công vào không gian tên gói, ví dụ: có thể nhìn thấy chức năng trong gói của bạn nhưng không gây ô nhiễm môi trường toàn cầu.

12

Đặt tệp sysdata.rda trong thư mục data của gói của bạn.

Không sử dụng Lazy Dữ liệu - File Mô tả của bạn nên hoặc không có một dòng cho LazyData, hoặc, nếu có, nó phải được LazyData: no

Trong bất kỳ tập tin trong thư mục .R R của gói của bạn thêm một dòng như thế này

data(sysdata, envir=environment()) 

tôi tạo ra một data.frame tên sysdata và lưu nó vào một tập tin gọi là sysdata.rda trong thư mục dữ liệu của một gói gọi anRpackage

Tôi đã thêm dòng trên vào tệp .R và cũng thêm chức năng chưa được báo cáo này chỉ để cho thấy rằng các chức năng trong gói có quyền truy cập vào dữ liệu.

foo <- function() tail(sysdata, 2) 

Sau đó, tôi nhìn thấy sau một phiên R

> library(anRpackage) 
> sysdata 
Error: object 'sysdata' not found 

> anRpackage:::sysdata 
    A B C 
1 1 6 a 
2 2 7 b 
3 3 8 c 
4 4 9 d 
5 5 10 e 

> anRpackage:::foo() 
    A B C 
4 4 9 d 
5 5 10 e 

Vì vậy, người dùng vẫn có thể truy cập dữ liệu, nhưng như bạn yêu cầu, họ không có trực tiếp truy cập. Người dùng vẫn có tùy chọn để chạy data(sysdata).

+3

Phản hồi này không trả lời câu hỏi. Tôi hỏi về phân chia dữ liệu thành các tệp khác nhau, không phải về phạm vi truy cập dữ liệu. – Nixuz

+1

Bạn nói rằng hiện tại bạn có nhiều tệp dữ liệu trong thư mục dữ liệu. Vì vậy, hãy thêm một dòng như 'dữ liệu (sysdata, envir = environment())' cho mỗi tệp dữ liệu đó để chúng sẽ được "tự động gắn vào môi trường gói nội bộ và không thể truy cập trực tiếp đến người dùng." Vui lòng làm rõ những gì bạn muốn. – GSee