2013-07-16 32 views
8

Khi tôi cài đặt gói yaml, một thông báo lỗi gây phiền nhiễu xuất hiện trong RStudio nếu nó đã được cài đặt trước đó. Làm thế nào tôi có thể biết nếu gói đã được cài đặt để tôi có thể quyết định trong mã của tôi cho dù cài đặt gói hay không?Làm cách nào để biết một gói nhất định đã được cài đặt chưa?

Thông điệp là trong một cửa sổ pop-up và nó là:

Một hoặc nhiều các gói sẽ được cập nhật bởi việc cài đặt này hiện được nạp. Khởi động lại R trước khi cập nhật các gói này là được khuyến khích mạnh mẽ. RStudio có thể khởi động lại R và sau đó tự động tiếp tục cài đặt sau khi khởi động lại (tất cả công việc và dữ liệu sẽ được bảo quản trong khi khởi động lại). Bạn có muốn khởi động lại R trước khi cài đặt không?

+0

Không thể lặp lại. Tôi không nhận được thông báo lỗi. (Tôi nhận được một thông báo thông báo cho tôi biết rằng nó đã được cài đặt.) Ah. Đó là thông báo mang tính thông tin của RStudio, không phải là tin nhắn từ R. –

+0

... Tại sao bạn lại cố gắng cài đặt nó nhiều lần? Lệnh tải gói đã cài đặt là 'thư viện (foo)'. Bạn đang chạy 'install.packages' do nhầm lẫn? –

+1

Tôi đang viết mã sẽ chạy trên các máy tính chưa từng sử dụng R trước đây. Vì vậy, mã cần phải có install.packages ("yaml") đầu tiên. Tôi lo ngại rằng nếu người dùng chạy mã hai lần liên tiếp vì một số lý do, thì thông báo sẽ bật lên và họ sẽ bị nhầm lẫn. – kng

Trả lời

12

này sẽ được tải yaml, cài đặt nó đầu tiên nếu nó vẫn chưa được cài đặt:

if (!require(yaml)) { 
    install.packages("yaml") 
    library(yaml) 
} 

hoặc nếu bạn muốn parameterize nó:

pkg <- "yaml" 
if (!require(pkg, character.only = TRUE)) { 
    install.packages(pkg) 
    if (!require(pkg, character.only = TRUE)) stop("load failure: ", pkg) 
} 

UPDATE. Parametrization.

+0

Cảm ơn bạn! Điều này hoạt động hoàn hảo. – kng

+0

Tốt hơn nhiều so với hack 'tryCatch' của tôi. Sẽ chấp nhận. – krlmlr

8

bạn có thể sử dụng installed.packages() để tìm các gói cài đặt

1

Tôi đang sử dụng xây dựng sau trong mã của tôi. Các phần thiết yếu là về gọi library trong tryCatch và cài đặt nó nếu nó không thành công:

lib.auto <- function(lib, version=NULL, install.fun=install.packages, ...) { 
    tryCatch(
    library(lib, character.only=T), 
    error=function(e) { 
     install.fun(lib, ...) 
     library(lib, character.only=T) 
    } 
) 
    if (!is.null(version)) { 
    if (packageVersion(lib) < version) { 
     require(devtools) 
     detach(paste0('package:', lib), unload=T, character.only=T) 
     install.fun(lib, ...) 
     library(lib, character.only=T) 
     if (packageVersion(lib) < version) { 
     stop(sprintf('Package %s not available in version %s. Installed version: %s', lib, version, 
        packageVersion(lib))) 
     } 
    } 
    } 
} 

lib.auto('BiocInstaller', 
     install.fun=function(lib) { 
      source("http://bioconductor.org/biocLite.R") 
      biocLite(lib) 
     }) 

options(repos=biocinstallRepos()) 
lib.auto.bioc <- lib.auto 

lib.auto.github <- function(lib, version=NULL, user, subdir=NULL, repo=lib) 
    lib.auto(lib, version=version, 
      install.fun=function(l, u, s, r) { 
      require(devtools) 
      install_github(r, u, subdir=s) 
      }, 
      user, subdir, repo   
) 

Chức năng lib.auto cài đặt từ cran và Bioconductor, nếu có yêu cầu. Số lib.auto.github lượt cài đặt từ GitHub.

Tôi đang suy nghĩ về việc đẩy mã này vào một gói.

3

Hoặc, bạn có thể sử dụng chức năng require. Nó sẽ cố gắng tải gói và âm thầm trả về lôgic cho biết gói có sẵn hay không. Ngoài ra còn có một cảnh báo nếu không thể tải gói.

test1 <- require("stats") 
test1 

test2 <- require("blah") 
test2