Как я могу автоматически добавлять/обновлять версии Depends/Imports/Suggests в DESCRIPTION?

Мне нравится обновлять пакеты R, и при разработке собственного пакета я хочу придерживаться совет:

Как правило, всегда лучше указать версию и быть консервативным в отношении того, какая версия требуется. Если вы не знаете иного, всегда требуйте версию, большую или равную версии, которую вы используете в настоящее время.

Итак, мне понадобятся некоторые из них здесь, в DESCRIPTION:

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

Существует ли существующий инструмент для программного обновления версий зависимостей на основе установленных пакетов?

Я знаю, что это мелочь, и я могу сделать это вручную, но я просто знаю, что об этом легко забыть.

Использование локально установленной версии пакета в качестве минимальной зависимости также имеет смысл, поскольку я тестировал/собирал с этими зависимостями.

Есть ли причина, по которой я не должен этого делать?


person maxheld    schedule 03.08.2016    source источник
comment
Одной из причин не использовать локальную версию pkg с автоматическим использованием является то, что вы используете ряд находящихся в разработке пакетов R, отличных от CRAN, поскольку большинство из них имеют номера версий, которые не будут соответствовать CRAN (и вы неизбежно забудьте изменить номер версии перед отправкой в ​​​​CRAN).   -  person hrbrmstr    schedule 03.08.2016


Ответы (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)
person hrbrmstr    schedule 03.08.2016
comment
Для тех, кому это может быть интересно, вы можете найти версию этой функции, которая проходит текущую проверку R CMD (с devtools::check()) здесь - person tjebo; 17.03.2021

Другой вариант — с пакетом usethis, хотя на самом деле он сразу перезаписывает файл описания, поэтому не уверен, что это всегда желательно.

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