Tôi đang chọn lọc thông qua gói và tập lệnh sử dụng gói và muốn xác định các phụ thuộc bên ngoài. Mục đích là sửa đổi các tập lệnh để chỉ định library(pkgName)
và sửa đổi các chức năng trong gói để sử dụng require(pkgName)
, để các phụ thuộc này sẽ rõ ràng hơn sau này.Xác định các phụ thuộc của chức năng và tập lệnh R
Tôi đang sửa đổi mã để giải thích cho mỗi gói phụ thuộc bên ngoài. Ví dụ, mặc dù nó không có nghĩa là dứt khoát, bây giờ tôi thấy khó xác định mã phụ thuộc vào data.table
. Tôi có thể thay thế data.table
bằng Matrix
, ggplot2
, bigmemory
, plyr
hoặc nhiều gói khác, vì vậy hãy trả lời bằng các ví dụ dựa trên các gói khác.
Tìm kiếm này không dễ dàng. Các cách tiếp cận tôi đã cố gắng cho đến nay bao gồm:
- Tìm kiếm mã cho
library
vàrequire
báo cáo - Tìm kiếm đề cập đến
data.table
(ví dụlibrary(data.table)
) - Thử chạy
codetools::checkUsage
để xác định nơi có thể có một số vấn đề. Đối với các tập lệnh, chương trình của tôi chèn tập lệnh vào một hàm cục bộ và áp dụngcheckUsage
cho hàm đó. Nếu không, tôi sử dụngcheckUsagePackage
cho gói. - Tìm kiếm các câu lệnh có phần duy nhất với
data.table
, chẳng hạn như:=
. - Hãy tìm nơi lớp đối tượng có thể được xác định thông qua ký hiệu Hungarian, chẳng hạn như
DT
Bản chất của việc tìm kiếm của tôi là tìm:
- tải
data.table
, - đối tượng với tên cho biết chúng là các đối tượng
data.table
, - các phương pháp có vẻ là
data.table
-specific
Phần dễ dàng duy nhất của điều này dường như là tìm nơi gói được tải. Thật không may, không phải tất cả các chức năng có thể tải hoặc yêu cầu gói bên ngoài một cách rõ ràng - chúng có thể giả định rằng nó đã được tải. Đây là một thực hành tồi, và tôi đang cố sửa nó. Tuy nhiên, việc tìm kiếm các đối tượng và phương pháp có vẻ khó khăn.
Điều này (data.table
) chỉ là một gói và một với những gì dường như bị hạn chế và sử dụng một phần duy nhất. Giả sử tôi muốn tìm cách sử dụng các hàm ggplot, nơi các tùy chọn mở rộng hơn và văn bản cú pháp không phải là kiểu riêng (ví dụ: sử dụng thường xuyên +
không phải là kiểu riêng, trong khi :=
có vẻ như).
Tôi không nghĩ rằng phân tích tĩnh sẽ đưa ra câu trả lời hoàn hảo, ví dụ: người ta có thể vượt qua một đối số cho một hàm, trong đó xác định một gói được nạp. Tuy nhiên: có bất kỳ công cụ hoặc gói cốt lõi nào có thể cải thiện phương pháp tiếp cận vũ phu này, hoặc thông qua phân tích tĩnh hoặc động?
Đối với giá trị của nó, tools::pkgDepends
chỉ địa chỉ phụ thuộc ở cấp gói, chứ không phải hàm hoặc cấp tập lệnh, là cấp mà tôi đang làm việc.
Cập nhật 1: Ví dụ về công cụ phân tích động sẽ hoạt động là báo cáo gói nào được tải trong khi thực thi mã. Tôi không biết nếu một khả năng như vậy tồn tại trong R, mặc dù - nó sẽ giống như Rprof
báo cáo đầu ra của search()
thay vì ngăn xếp mã.
Bạn có thể thử 'foodweb' trong gói' mvbutils' không? Tôi không có kinh nghiệm với nó bản thân mình nhưng nó có vẻ hứa hẹn cho tôi (ngoại trừ tôi không biết làm thế nào sâu nó tìm kiếm). Một cái gì đó như 'foodweb (nơi = 'gói: data.table', prune = 'function_youre_examining')'? –
@ mathematics.coffee Điều đó rất hấp dẫn. Có vẻ như nó sẽ khá hữu ích trong gói; Tôi chưa rõ ràng về những gì nó có thể làm liên-gói, nhưng tôi sẽ cung cấp cho nó một whirl, cảm ơn! – Iterator
@ mathematics.coffee Điều này rất thú vị. Tôi đang cắm nó đi xa hơn một chút. Bạn có thể đăng bình luận của bạn như là một câu trả lời? Tôi có thể giúp chỉnh sửa nó thành một giải pháp, giả sử tôi có thể làm cho nó hoạt động. Trước đây tôi đã nhận xét rằng nó dường như không hoạt động trên các gói, nhưng điều đó không đúng. Đối số 'where' dường như làm thủ thuật để quản lý không gian tìm kiếm. Btw, sự giúp đỡ cho changes.funs đọc gần như tôi sẽ viết về một số kinh nghiệm gần đây của tôi. :) – Iterator