2015-05-13 25 views
11

Với tệp DESCRIPTION của gói R, tôi muốn lấy danh sách các gói phụ thuộc (ví dụ: Depends, Imports, Suggests). Có vẻ như đây là vấn đề được giải quyết (ví dụ: devtools::install_github) nhưng tôi dường như không thể tìm ra cách thanh lịch để thực hiện việc này. Giải pháp hiện tại của tôi là dựa vào một chức năng unexported từ tools:Trích xuất phụ thuộc gói R thanh lịch của gói không được liệt kê trên CRAN

## adapted.from biocLite("pkgDepTools") 
cleanPkgField <- function(val) { 
    if (is.na(val)) 
     return(character(0)) 
    val <- names(tools:::.split_dependencies(val)) 
    if (is.null(val)) 
     return(character(0)) 
    val <- val[! val %in% "R"] 
    if (length(val)) 
     return(val) 
    return(character(0)) 
} 

get_deps <- function(dp){ 
    dcf <- read.dcf(paste0(dp, "/DESCRIPTION")) 
    suggests <- imports <- depends <- NULL 
    if("Suggests" %in% colnames(dcf)) 
    suggests <- cleanPkgField(dcf[,"Suggests"]) 
    if("Imports" %in% colnames(dcf)) 
    imports <- cleanPkgField(dcf[,"Imports"]) 
    if("Depends" %in% colnames(dcf)) 
    depends <- cleanPkgField(dcf[,"Depends"]) 

    c(suggests, imports, depends) 

    ## Doesn't work for packages not on CRAN 
# unlist(tools::package_dependencies(package_names, available.packages(), 
#   which=c("Depends", "Imports", "Suggests"), recursive=FALSE)) 
} 

nơi dp là thư mục gói. Điều này dường như làm việc, nhưng nó cảm thấy như có nên có một chức năng mở rộng để làm điều này, hoặc ít nhất một cái gì đó sạch hơn là dựa vào chức năng .split_dependencies() ẩn và không xuất khẩu trong gói tools.

Lưu ý rằng cách được trích dẫn rộng rãi hơn để nhận phụ thuộc cho gói không phải dựa vào tệp DESCRIPTION, mà là sử dụng một cái gì đó như tools::package_dependencies giả định gói có thể được tìm thấy trên một số kho lưu trữ giống CRAN, ví dụ: những SO câu hỏi:

lưu ý rằng trong khi mô tả vấn đề là như nhau, thực tế là các gói không nằm trong cran (hoặc kho tương tự) làm cho cách tiếp cận mà không thể .

Trả lời

6

Đây là ít nhất một chút đơn giản hơn và không dựa vào bất kỳ chức năng unexported:

get_deps <- function(path) { 
    dcf <- read.dcf(file.path(path, "DESCRIPTION")) 
    jj <- intersect(c("Depends", "Imports", "Suggests"), colnames(dcf)) 
    val <- unlist(strsplit(dcf[, jj], ","), use.names=FALSE) 
    val <- gsub("\\s.*", "", trimws(val)) 
    val[val != "R"] 
} 

## Test it out on a source package with no imports ... 
get_deps("C:/R/Source/Library/raster") 
## [1] "methods" "sp"  "rgdal"  "rgeos"  "ncdf"  "ncdf4"  
## [7] "igraph" "snow"  "tcltk"  "rasterVis" 

## ... and an installed package with no dependencies at all 
get_deps("C:/R/Library/RColorBrewer/") 
# named character(0) 
Các vấn đề liên quan