【问题标题】:How can I automatically add/update Depends/Imports/Suggests versions in DESCRIPTION?如何在DESCRIPTION中自动添加/更新Depends/Imports/Suggests版本?
【发布时间】:2016-12-08 20:41:37
【问题描述】:

我喜欢让我的 R 包保持最新,在开发我自己的包时,我想坚持@Hadley 的advice

通常,最好指定版本并保守地确定需要哪个版本。除非您另有了解,否则请始终要求版本大于或等于您当前使用的版本。

所以,我需要DESCRIPTION 中的一些:

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

是否有现成的工具可以根据我当前安装的包以编程方式更新依赖项的版本?

我知道这是一件小事,我可以手动完成,但我只知道这是很容易忘记的事情。

使用 本地 安装的软件包版本作为最低依赖项似乎也很有意义,因为我使用这些依赖项进行了测试/构建。

我有理由不这样做吗?

【问题讨论】:

  • 不使用自动使用本地 pkg 版本的一个原因是,如果您使用许多非 CRAN、正在开发的 R 包,因为其中大多数的版本号不匹配CRAN(而且,您将不可避免地忘记在 CRAN 提交之前修改版本号)。

标签: r devtools roxygen2 package-development


【解决方案1】:

另一个选项是使用usethis 包,尽管这实际上会立即覆盖描述文件,所以不确定是否总是需要这样做

# use overwrite = TRUE to update dependencies with version numbers
usethis::use_latest_dependencies(overwrite = TRUE, source = "CRAN")

【讨论】:

    【解决方案2】:

    这应该按照你的要求去做(好吧,你仍然需要将输出剪切/粘贴到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)
    

    【讨论】:

    • 对于可能感兴趣的人,您可以找到通过当前 R CMD 检查的此功能的版本(使用devtools::check()here
    猜你喜欢
    • 2016-09-08
    • 1970-01-01
    • 2012-01-28
    • 2021-07-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多