2016-08-03 18 views
1

我喜歡讓我的R程序包的更新,並在發展自己的包,我想堅持@哈德利的advice如何自動添加/更新描述中的Depends/Imports/Suggests版本?

一般情況下,它總是最好指定版本,並保守哪些版本要求。除非您知道其他情況,否則始終要求版本大於或等於您當前使用的版本。

所以,我需要一些那些在這裏DESCRIPTION

Imports: 
knitr (>= 1.13), 
rmarkdown (>= 1.0) 

有一個現有的工具來編程方式更新的依賴基於我公司目前已安裝的軟件包版本?

我知道這是一件小事,我可以手動做到這一點,但我只是知道這是那種容易被人遺忘的事情。

在本地使用已安裝的軟件包版本作爲最小依賴關係似乎也有意義,因爲我測試/構建了這些依賴關係。

難道我不應該這樣做嗎?

+1

不自動使用本地pkg版本的一個原因是如果您使用一些非CRAN,在開發中的R packag因爲其中大多數版本的版本號與CRAN不匹配(並且,在CRAN提交之前,您將不可避免地忘記修改版本號)。 – hrbrmstr

回答

1

這SHLD你問什麼(當然,你仍然需要剪切/粘貼到輸出:-) DESCRIPTION

#' Add curent version string to package dependencies 
#' 
#' Will \code{cat} out a cut/paste-able set of fields for a 
#' \code{DESCRIPTION} file with minimum required versions for 
#' each package based upon currently available package vesions 
#' in CRAN. 
#' 
#' @param pkg package description, can be path or package name 
#' @param fields fields to get & report dependencies for 
#' @note R and the R version is NOT added to \code{Depends} 
#' @examples 
#' add_pkg_versions("qmethod") 
#' add_pkg_versions("MASS") 
#' \dontrun { # assumes you're in a pkg devel dir 
#' add_pkg_versions() 
#' } 
add_pkg_versions <- function(pkg=".", 
          fields=c("Depends", "Imports", "LinkingTo", "Suggests")) { 

    require(purrr) 
    walk(c("dplyr", "tools", "stringi", "devtools"), require, character.only=TRUE) 

    stopifnot(is_scalar_character(pkg), pkg != "") 
    fields <- match.arg(fields, c("Depends", "Imports", "LinkingTo", "Suggests"), 
         several.ok=TRUE) 

    avail <- as_data_frame(available.packages()) 

    if (pkg == ".") { 
    pkg_deps <- unclass(as_data_frame(read.dcf(file.path(package_file(), "DESCRIPTION")))) 
    pkg <- pkg_deps$Package 
    map(fields, ~stri_split_lines(pkg_deps[[.]])) %>% 
     map(function(x) { 
     if (length(x) > 0) { 
      unlist(x) %>% 
      stri_replace_all_regex(" \\(.*$|,", "") %>% 
      discard(`%in%`, c("", "R")) 
     } else { x } 
     }) -> pkg_deps 
    names(pkg_deps) <- fields 
    } else { 
    pkg_deps <- map(fields, ~flatten_chr((package_dependencies(pkg, which=.)))) 
    names(pkg_deps) <- fields 
    } 

    pkg_deps <- discard(pkg_deps, function(x) {length(x)==0}) 

    map(pkg_deps, function(x) { 

    non_base <- filter(avail, Package %in% x) 
    base <- setdiff(x, non_base$Package) 

    non_base %>% 
     mutate(pv=sprintf("%s (>= %s)", Package, Version)) %>% 
     select(pv) %>% 
     flatten_chr() -> pkg_plus_version 

    sort(c(pkg_plus_version, base)) 

    }) -> pkg_deps 

    cat("Package: ", pkg, "\n", sep="") 
    walk(names(pkg_deps), function(x) { 

    cat(x, ":\n", sep="") 
    sprintf(" %s", pkg_deps[[x]]) %>% 
     paste0(collapse=",\n") %>% 
     cat() 
    cat("\n") 

    }) 

} 

你的一個包裹:

add_pkg_versions("qmethod") 

Package: qmethod 
Imports: 
    digest (>= 0.6.10), 
    GPArotation (>= 2014.11-1), 
    knitr (>= 1.13), 
    methods, 
    psych (>= 1.6.6), 
    tools, 
    xtable (>= 1.8-2) 

只是爲了顯示邊緣案件處理:

add_pkg_versions("MASS") 

Package: MASS 
Depends: 
    graphics, 
    grDevices, 
    stats, 
    utils 
Imports: 
    methods 
Suggests: 
    lattice (>= 0.20-33), 
    nlme (>= 3.1-128), 
    nnet (>= 7.3-12), 
    survival (>= 2.39-5)