2015-10-09 15 views
5

Tôi phải tạo gói R phụ thuộc vào gói data.table. Tuy nhiên, nếu tôi sẽ làm một chức năng như một tiếp theo trong góiTạo một gói hàng R phụ thuộc vào dữ liệu. Có thể

randomdt <- function(){ 
    dt <- data.table(random = rnorm(10)) 
    dt[dt$random > 0] 
} 

chức năng [ sẽ sử dụng phương pháp cho data.frame không cho data.table và do đó các lỗi

Error in `[.data.frame`(x, i) : undefined columns selected 

sẽ xuất hiện. Thông thường điều này sẽ được giải quyết bằng cách sử dụng get('[.data.table') hoặc phương pháp tương tự (package::function là đơn giản nhất) nhưng dường như không hoạt động. Sau khi tất cả, [ là một chức năng nguyên thủy và tôi không biết làm thế nào các phương pháp để nó hoạt động.

Vì vậy, làm cách nào tôi có thể gọi hàm data.table [ từ gói của mình?

+0

Bạn có thể phải đảm bảo rằng 'data.table' được tải khi gói của bạn được tải. – Jaap

+2

Thêm 'Depends: data.table' vào tệp' Description' của bạn. – Soheil

+4

Bạn đã đọc [FAQ 6.9] (https://cran.r-project.org/web/packages/data.table/vignettes/datatable-faq.pdf) chưa? – Arun

Trả lời

5

Cập nhật dựa trên một số phản hồi từ MichaelChirico và nhận xét của ArunSoheil.

Nói một cách cơ bản, có hai phương pháp bạn có thể xem xét. Đầu tiên là xây dựng sự phụ thuộc vào gói của bạn, trong khi thứ hai là bao gồm các dòng trong mã R của bạn để kiểm tra sự hiện diện của data.table (và thậm chí có thể cài đặt nó tự động nếu nó không được tìm thấy).

Các data.tableFAQ giải quyết cụ thể này trong 6,9, và nói rằng bạn có thể đảm bảo rằng data.table được một cách thích hợp nạp bởi gói của bạn bằng cách:

Hoặc i) bao gồm data.table trong Phụ thuộc: lĩnh vực mô tả của bạn tập tin, hoặc ii) bao gồm data.table trong trường Imports: của tệp DESCRIPTION AND import (data.table) trong tệp NAMESPACE của bạn.

Như đã lưu ý trong nhận xét, đây là hành vi R phổ biến trong nhiều gói.

Cách tiếp cận khác là tạo các dòng mã cụ thể để kiểm tra và nhập các gói cần thiết như một phần của mã của bạn. Đây là, tôi sẽ tranh luận, không phải là giải pháp lý tưởng cho sự sang trọng của việc sử dụng các tùy chọn được cung cấp ở trên. Tuy nhiên, nó là kỹ thuật có thể.

Cách đơn giản để thực hiện việc này là sử dụng require hoặc library để kiểm tra sự tồn tại của data.table, với lỗi được ném nếu không thể đính kèm. Bạn thậm chí có thể sử dụng một tập hợp các câu lệnh điều kiện đơn giản để chạy install.packages để cài đặt những gì bạn cần nếu tải chúng không thành công.

Yihui Xie (của sự nổi tiếng knitr) có một bài tuyệt vời về sự khác biệt giữa libraryrequirehere và làm cho một trường hợp mạnh mẽ cho chỉ sử dụng library trong trường hợp gói là hoàn toàn cần thiết cho mã sắp tới.

+1

Tại sao lại là downvote? Nhận xét về cách cải thiện câu trả lời, có thể? – TARehman

+0

@MichaelChirico Một tập hợp các đề xuất hợp lý. Tôi đã cố gắng mở rộng vấn đề này và liên kết một số vật phẩm được đề cập bởi Arun và Soheil. Nếu bạn có bất kỳ đề xuất bổ sung nào, tôi rất sẵn lòng sửa đổi thêm. – TARehman

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