2016-08-03 7 views
1

Ich mag meine R-Pakete zu dem Laufenden halten, und mein eigenes Paket zu entwickeln, möchte ich @ Stick Hadleys advice:Wie kann ich Abhängigkeiten/Importe/Suggests-Versionen automatisch in BESCHREIBUNG hinzufügen/aktualisieren?

Im Allgemeinen ist es immer besser, die Version zu bestimmen und über die konservativ zu sein Version zu erfordern. Sofern Sie nichts anderes wissen, benötigen Sie immer eine Version, die größer oder gleich der Version ist, die Sie gerade verwenden.

Also, ich werde in DESCRIPTION einige von denen hier brauchen:

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

Gibt es ein vorhandenes Werkzeug programmatisch die Versionen von Abhängigkeiten aktualisieren, basierend auf den Paketen ich derzeit installiert?

Ich weiß, das ist eine kleine Sache, und ich kann das manuell tun, aber ich weiß nur, das ist die Art von Sache, die leicht vergessen wird. Die lokal installierte Version eines Pakets als Mindestabhängigkeit scheint auch Sinn zu ergeben, weil ich mit diesen Abhängigkeiten getestet/gebaut habe.

Gibt es einen Grund, warum ich das nicht tun sollte?

+1

Ein Grund, die lokale pkg Version nicht zu verwenden ist, wenn Sie eine Anzahl von nicht-CRAN, in-Entwicklung R packag verwenden es da die meisten von denen haben Versions # #, die CRAN nicht übereinstimmen (und Sie werden unweigerlich vergessen, die Versions # vor einer CRAN-Einreichung zu ändern). – hrbrmstr

Antwort

1

Diese shld tun, was Sie fragen (na ja, Sie müssen noch

#' 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") 

    }) 

} 

Einer Ihrer Pakete die Ausgabe in DESCRIPTION :-) Ausschneiden/Einfügen:

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) 

Gerade Kante zeigen Fälle werden gehandhabt:

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) 
Verwandte Themen