2016-08-03 6 views
1

Я хотел бы сохранить свои пакеты R до настоящего времени, а также в разработке мой собственный пакет, я хочу, чтобы придерживаться @ Хедли advice:Как я могу автоматически добавлять/обновлять версии Depends/Imports/Offersests в DESCRIPTION?

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

Таким образом, я буду нуждаться в некоторых из тех, кто здесь в 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) 
Смежные вопросы