2012-01-08 28 views
8

Điều gì sẽ xảy ra nếu gói được cài đặt trong nhiều thư viện? Ví dụ, trong Debian/Ubuntu người ta có thể cài đặt các gói debianized thông qua apt-get, và sau đó cũng cài đặt một phiên bản mới hơn của cùng một gói thẳng từ CRAN. Khi sử dụng thư viện(), gói mới nhất sẽ được tải hay không phụ thuộc vào thứ tự của .libPaths()?Gói R giống nhau trong nhiều thư viện

Trả lời

5

Như đã nói bởi những người khác, .libPaths() nhằm tìm kiếm vấn đề đó là lý do chúng tôi thiết lập nó như vậy mà gói địa phương đang tìm kiếm đầu tiên như các phiên bản distro, đặc biệt là với Debian ổn định hoặc Ubuntu phiên bản mà không được cập nhật, có nhiều khả năng trở thành cũ .

Có một bình luận cho hiệu ứng này trong file /etc/R/Renviron đặt nó:

# edd Apr 2003 Allow local install in /usr/local, also add a directory for 
#    Debian packaged CRAN packages, and finally the default dir 
# edd Jul 2007 Now use R_LIBS_SITE, not R_LIBS 
R_LIBS_SITE=${R_LIBS_SITE-'/usr/local/lib/R/site-library:/usr/lib/R/site-library:/usr/lib/R/library'} 

Vì vậy, một giá trị do người dùng thiết lập các R_LIBS_SITE sẽ nhận được ưu tiên, nếu không giá trị đưa ra ở đây được sử dụng.

+1

+1 cho câu trả lời và mô tả cụ thể về logic bạn đã sử dụng trong thiết kế. –

5

Sự hiểu biết của tôi là nó sẽ phụ thuộc vào thứ tự của .libPaths(). Đây là mã từ library

if (!missing(package)) { 
     if (is.null(lib.loc)) 
      lib.loc <- .libPaths() 
     lib.loc <- lib.loc[file.info(lib.loc)$isdir %in% TRUE] 
    # >>>> snipped code 
     newpackage <- is.na(match(pkgname, search())) 
     if (newpackage) { 
      pkgpath <- find.package(package, lib.loc, quiet = TRUE, 
       verbose = verbose) 
      if (length(pkgpath) == 0L) { 
      # snipped 

Và đây là từ các trang trợ giúp cho find.package

Details 

find.package returns path to the locations where the given packages are found. 
If lib.loc is NULL, then attached packages are searched before the libraries. 
If a package is found more than once, the first match is used. 

Và nếu có nhiều hơn một ví dụ, sau đó có phải là một cảnh báo dựa trên việc đọc của tôi về find.package mã (trừ khi bạn đặt "tiết" thành FALSE):

if (length(paths) > 1L) { 
      paths <- paths[1L] 
      if (verbose) 
       warning(gettextf("package %s found more than once,\n 
           using the one found in %s", 
        sQuote(pkg), sQuote(paths)), domain = NA) 
0

Nếu bạn cài đặt gói bằng apt-get, bạn sẽ là người dùng sudo, do đó, librari es sẽ cài đặt ở vị trí trên toàn hệ thống (thường là/usr/lib/R).

Khi bạn sử dụng CRAN, bạn cũng có thể là sudo hoặc người dùng thông thường. Trong các gói case đầu tiên sẽ cài đặt toàn hệ thống (các tập tin ghi đè được cài đặt bằng apt-get); trong trường hợp thứ hai, các gói sẽ cài đặt vào $ HOME/R của người dùng.

Trường hợp gói tồn tại trong cả hai/usr/lib/R và $ HOME/R, vị trí đầu tiên trong .libPaths() sẽ được sử dụng khi tải (thường là $ HOME/R).

CHỈNH SỬA: như Dirk đã chỉ ra, cài đặt trên toàn hệ thống phải đi tới/usr/local/lib/R /, không/usr/lib/R. Tuy nhiên, điểm chung của tôi là: vị trí cài đặt phụ thuộc vào quyền người dùng và thứ tự tải phụ thuộc vào .libPaths().

+1

Điều đó không chính xác, ít nhất không phải là bạn sử dụng các tệp nhị phân R được tạo sẵn cho Ubuntu hoặc Debian_ khi chúng tôi đặt 'R_LIBS' et al sao cho cài đặt cục bộ luôn đi tới'/usr/local/lib/R/'. Đề án đó đã hoạt động từ năm 2003 cho tới hàng nghìn người dùng. –

+0

Vậy điều gì sẽ xảy ra nếu tôi chạy update.packages()? Nó sẽ cố gắng ghi đè lên các tập tin bên trong '/ usr/lib/R', hay nó sẽ cài đặt các bản sao trên'/usr/local/lib/R'? – Jeroen

+0

Dirk bạn có thể làm rõ: trên hệ thống của tôi, tôi thấy các gói trong cả thư mục/usr/lib/R/site-library/và/usr/local/lib/R/site-library /. Dường như, ví dụ, r-cran-rjava đã được cài đặt vào thư mục/usr/lib/R/site-library/rJava. – neilfws

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