2011-11-03 5 views
21

Trước khi nâng cấp lên R-2.14, tôi muốn nhân cơ hội hợp lý hóa cấu trúc thư mục của các gói đã cài đặt của tôi.Làm cách nào để quản lý nhiều vị trí gói (thư mục) trong R?

Hiện tại tôi sử dụng mặc định R, nghĩa là tất cả các gói mới được cài đặt sẽ chuyển sang R_LIBS_USER. Tuy nhiên, tôi thực sự phân biệt giữa hai loại gói:

  • Gói tôi sử dụng nhiều lần để thực hiện công việc của mình, ví dụ: plyr, data.table vv
  • Gói tôi cài đặt chỉ để thử nghiệm với (thường lặp lại một câu hỏi hoặc trả lời trên StackOverflow)

Kể từ install.packages cung cấp một tùy chọn để chỉ định một lập luận lib, điều này rõ ràng là có thể.

Có cách nào dễ dàng để quản lý vị trí gói, ví dụ: bằng cách tạo một số cài đặt hợp lý/hàm bao bọc trong .RProfile hoặc RProfile.Site?

+1

Đây là [câu hỏi có liên quan và hữu ích] (http://stackoverflow.com/questions/2988559/how-do-you-use-multiple-versions-of-the-same-r-package). – Iterator

Trả lời

24

Có nhiều tùy chọn cho điều đó. Điều đầu tiên tôi làm là điều chỉnh Rprofile.site của tôi để chứa dòng sau, làm cho đường dẫn thư viện mặc định của tôi là một thư mục không có trong bản cài đặt R của tôi.

.libPaths(c("D:/R/Library",.libPaths())) 

Điều này làm cho D:/R/Library đường dẫn mặc định của tôi mà không bị mất các đường dẫn khác. Bạn có thể thêm hai đường dẫn vào một đường dẫn, giả sử D:/R/Library/WorkD:/R/Library/Test. Vị trí được đặt ở vị trí đầu tiên là vị trí mặc định được sử dụng nếu bạn không chỉ định lib trong install.packages().

Sau đó, bạn có thể chỉ định hai biến trong .Rprofile.site của mình. Những cái này được gán trong không gian tên cơ sở, và do đó luôn luôn có thể truy cập và không bị xoá bởi ls(). Một cái gì đó như

.libwork <- 'D:/R/Library/Work' 
.libtest <- 'D:/R/Library/Test' 

cho phép bạn cài đặt các gói như:

install.packages('aPackage',lib=.libwork) 

Có những lựa chọn khác nữa tôi đoán, nhưng đây là cách tôi sẽ lăn.

+0

+1 Mẹo tuyệt vời, Joris. –

+3

Một lưu ý cảnh báo khi sử dụng phương pháp này: nó dẫn đến các biến chứng khi cố gắng kiểm tra/xây dựng/cài đặt các gói với kiểm tra 'R CMD ...'. Lý do là 'R CMD check' và' R CMD build' không đọc '.Rprofile' (http://cran.r-project.org/doc/manuals/R-exts.html#Checking-and- xây dựng-gói). – Andrie

4

Bạn có nghĩa vụ có thể chỉ định một số đường dẫn thư viện/cây thông qua danh sách đường dẫn được phân tách bằng dấu hai chấm trong biến môi trường R_LIBS. Tôi không thể làm điều này để làm việc đáng tin cậy trên R 2.13.1-patched - nó chỉ bao giờ có mục đầu tiên. Tôi nhận được R_LIBSR_LIBS_USER để hoạt động đáng tin cậy trên hệ thống của mình - tôi thường chỉ đặt cài đặt trước đây.

.libPaths() có thể thêm đường dẫn mới vào bộ cây thư viện được tìm kiếm. Tôi chỉ cần thêm các cuộc gọi thích hợp vào .libPaths(new) trong số .Rprofile để thêm các cây liên quan cho mỗi phiên. Sau đó, bạn có thể chọn nơi cài đặt các gói tại thời điểm cài đặt - nghĩa là cây nào sẽ sử dụng.

+0

Cùng trải nghiệm ở đây. Đó là lý do tại sao tôi sử dụng .libPaths() để thiết lập chúng. Cũng vì install.packages() lấy giá trị đầu tiên của .libPaths() làm mặc định. Tôi chỉ thấy nó dễ dàng hơn không quan trọng với các biến môi trường. –

2

Để trả lời, tôi phải đưa ra một chút ngữ cảnh.

Vì mục đích tái tạo, tôi cố gắng viết kịch bản, bao gồm cả toàn bộ thiết lập R của tôi. Tôi có một kịch bản "initializeR.r", trong số những thứ khác, cài đặt gói và tôi đã sắp xếp các gói trong các gói, chẳng hạn như các gói liên quan đến bộ nhớ đệm, các liên quan đến trực quan hóa, lấy mẫu, thống kê không gian, v.v. nhiệm vụ xem, nếu bạn sẽ.

Ví dụ, đây là một đoạn trích:

# Profiling & testing 
Packages$CodingTools = c("codetools","debug", "profr","proftools","RUnit") 

tôi kết hợp một số các gói vào một gói "Major" (hay chính) danh sách và những người khác đi vào danh sách "thứ cấp". Tôi chắc chắn sẽ cài đặt mọi thứ trong danh sách chính - cần thiết để có môi trường R hợp lý, sử dụng các tập lệnh, chức năng và gói của riêng tôi, v.v. (Btw, một số gói được gán cho nhiều gói, nhưng chỉ một vài gói; I de-dupe trước khi xử lý danh sách tổng hợp.)

Sau đó tôi chỉ định thư viện mặc định cụ thể cho nền tảng và cài đặt ở đó. Tuy nhiên, khả năng này có thể mở rộng và ý tưởng này có thể được mở rộng để bao gồm các vị trí tùy chọn cho mỗi gói gói (hoặc gói): chỉ bản đồ từ tên gói, ví dụ: "CodingTools" vào một thư mục duy nhất (đường dẫn thư viện), nói "D:/R/Library/CodingTools". Điều này có thể được thực hiện trong tập lệnh khởi tạo, với các danh sách phù hợp & các tùy chọn mặc định hoặc các vị trí có thể được lưu ở nơi khác, chẳng hạn như bảng băm, JSON hoặc cơ sở dữ liệu.

Như những người khác đã nói, đường dẫn thư viện mặc định cần được truyền đạt đến R. Điều đó có thể được thực hiện trong .RProfile.site. Trong trường hợp của tôi, tôi có một kịch bản khác được sử dụng để khởi tạo thể hiện R như tôi muốn. Tôi cố gắng tránh các tệp tham số bên ngoài được đọc bởi R (ví dụ: .Rprofile) và thay vào đó thực hiện tất cả các lần khởi tạo thông qua các cuộc gọi hàm trong gói của riêng tôi (mặc dù các tham số vẫn ở bên ngoài). Điều này có xu hướng giúp tôi gỡ lỗi và tái tạo tác phẩm của mình dễ dàng hơn. Vì vậy, đường dẫn thư viện của tôi có thể được bao gồm trong cùng một loại JSON nơi các vị trí tệp dữ liệu của tôi được chỉ định.

Cá nhân, tôi muốn thoát khỏi việc xác định các gói bên trong tập lệnh và thay vào đó sử dụng JSON, vì tôi có thể dễ dàng tạo các tệp JSON khác nhau cho các cấu hình thiết lập khác nhau. Tôi đã làm điều này cho hầu hết các mục đích khác của công việc tái sản xuất.