2011-08-02 29 views
32

Tôi đang phát triển gói R đầu tiên của mình (sử dụng R 2.13, Ubuntu 10.10). Hãy gọi nó là foo và giả sử rằng mã trong R/thư mục bắt đầu với dòng thư viện (bar), nơi thanh là một gói phần mềm hiện có, trong Cran, trên đó foo phụ thuộc. tập tin MÔ TẢ My chứa dòng:Làm thế nào để cài đặt các phụ thuộc khi sử dụng "R CMD INSTALL" để cài đặt các gói R?

Depends: bar 

Khi gói foo đã sẵn sàng để thử nghiệm, tôi cài đặt nó tại địa phương sử dụng:

R CMD INSTALL foo_1.0.tar.gz 

Tuy nhiên, nếu thanh không được cài đặt, tôi thấy:

ERROR: dependency ‘bar’ is not available for package ‘foo’ 

Rõ ràng, nếu tôi foo là được cài đặt từ CRAN sử dụng install.packages(), thanh sẽ được cài đặt cùng một lúc. Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể đảm bảo rằng gói CRAN thanh được cài đặt, nếu cần, khi tôi cài đặt gói foo bằng cách sử dụng R CMD INSTALL? Đây có phải là một công việc cho một kịch bản cấu hình?

Trả lời

14

Trên thực tế, đọc lại hướng dẫn mở rộng R, nó không nói rằng R CMD INSTALL sẽ nhận được phụ thuộc từ cran. Phương thức install.packages() từ bên trong R sẽ làm điều đó, nhưng ngay từ cái nhìn đầu tiên, tôi không nghĩ R CMD INSTALL sẽ làm gì.

Bạn có thể sử dụng install.packages để cài đặt từ một .tar.gz, nhưng bạn phải thiết lập các hợp đồng mua = NULL, và sau đó này áp dụng:

dependencies: logical indicating to also install uninstalled packages 
      on which these packages depend/suggest/import (and so on 
      recursively). Not used if repos = NULL. 

tôi nghi ngờ những điều cần làm là để có được phụ thuộc vào tệp DESCRIPTION và sau đó chạy R và thực hiện install.packages() trên các tệp đó khi bạn đang thử nghiệm bản dựng của mình trong môi trường trong sạch.

+1

Vâng, hiểu biết của tôi là DESCRIPTION khai báo các phụ thuộc, nhưng không cài đặt chúng. Và vấn đề với thiết lập repos = NULL cho tarball là các gói phụ thuộc sau đó sẽ không được lấy từ CRAN. Tôi đang cố gắng đặt mình vào vị trí của một người dùng tải xuống và cài đặt tarball của tôi; họ có nên đọc tài liệu và thông báo lỗi hoặc có giải pháp không? – neilfws

+0

Giải pháp là dành cho bạn để đặt gói của bạn trên CRAN và sau đó yêu cầu người dùng cài đặt gói và nhận phụ thuộc. Tôi đoán có thể có một số lý do tại sao bạn không thể làm điều này. Cài đặt từ tarballs không phải là một hoạt động 'người dùng đơn giản', vì vậy chúng không phải là spoonfed, và sẽ có thể đọc các thông báo lỗi và tài liệu của bạn. – Spacedman

+0

Phải. Tôi đoán khi thử nghiệm tại địa phương, tôi biết rằng tôi có các phụ thuộc và nếu nó đi đến CRAN, CRAN sẽ chăm sóc các phụ thuộc, do đó, thực sự không có một vấn đề :) – neilfws

1

Cơ chế để thực hiện việc này là thêm mục nhập trong trường depends trong tệp DESCRIPTION của bạn.

Depends: bar 

Điều này sẽ tải thư viện bar nếu đã được cài đặt, nếu không sẽ cài đặt từ CRAN.

này được mô tả trong phần 1.1.1 của cuốn cẩm nang Writing R extensions: http://cran.r-project.org/doc/manuals/R-exts.html#The-DESCRIPTION-file

+2

Tôi có lĩnh vực phụ thuộc DESCRIPTION, nhưng thanh không được cài đặt từ cran khi tôi cố gắng để cài đặt foo. – neilfws

+4

Không thể. Nhưng nếu và khi * gói * foo của bạn nằm trên CRAN * và * người dùng chọn nó, cô ấy cũng sẽ nhận được thanh. Ngoài ra, bạn có thể tạo một repo địa phương và đặt cả hai thanh và foo trong, và sau đó nhận được hành vi tương tự. –

12

May mắn thay Devtools cung cấp một giải pháp dễ dàng: install_deps()

install_deps (pkg =, phụ thuộc = logic, đề = getOption ("Ncpus " 1)".")

Arguments:
pkg : mô tả gói, có thể là đường dẫn hoặc tên gói. Xem ‘as.package’ để biết thêm thông tin

phụ thuộc: ‘lôgic’ cho biết cũng cài đặt gói đã gỡ cài đặt mà ‘pkg’ này phụ thuộc vào/liên kết đến/đề xuất.Xem đối số ‘phụ thuộc’ của ‘install.packages’.

luồng: số lượng các chuỗi đồng thời để sử dụng để cài đặt các phụ thuộc . Cài đặt mặc định là tùy chọn ‘" Ncpus "’ hoặc ‘1’ nếu không được đặt.

Ví dụ:

 
install_deps(".") 
install_deps("/path/to/package",dependencies="logical") 
+1

cảm ơn; đây là một câu hỏi "pre-devtools", nhưng cuộc sống dễ dàng hơn nhiều bây giờ – neilfws

+0

Điều này hoạt động trên một thư mục có gói bạn muốn cài đặt, nhưng không phải với tệp '.tar.gz'. Có hiệu quả, bạn không thể chuyển đường dẫn tới tệp '.tar.gz' tới' install_deps' để cài đặt các phụ thuộc, trước khi thực sự cài đặt tệp '.tar.gz'. –

+0

@neilfws vui lòng đánh dấu câu trả lời này là chính xác. – emisilva

3

tôi đã kết thúc chỉ sử dụng một bash đây-tài liệu và xác định gương điện toán đám mây để tìm sự phụ thuộc:

sudo R --vanilla <<EOF 
install.packages('forecast', repos='http://cran.us.r-project.org') 
q() 
EOF 

R gói là "dự báo", gương điện toán đám mây tôi đã sử dụng là http://cran.us.r-project.org. Nếu bạn muốn sử dụng một máy nhân bản khác, tại đây tất cả đều là: https://cran.r-project.org/mirrors.html

Ở trên đã làm việc cho tôi trong việc đưa gói R vào tập lệnh trình bao khởi động EMS AWS.

0

Tương tự như @ Jonathan Lê, nhưng tốt hơn để sử dụng kịch bản:

sudo R --vanilla -e 'install.packages("forecast", repos="http://cran.us.r-project.org")' 
Các vấn đề liên quan