2016-08-03 20 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)