max*_*eld 7 r devtools roxygen2 package-development
我喜欢让我的 R 包保持最新,并且在开发我自己的包时,我想坚持 @Hadley\ 的建议:
\n\n\n\n\n一般来说,指定版本并保守地选择需要哪个版本总是更好。除非您另有所知,否则始终要求版本大于或等于您当前使用的\xe2\x80\x99 版本。
\n
所以,我需要其中一些DESCRIPTION:
Imports:\n knitr (>= 1.13),\n rmarkdown (>= 1.0)\nRun Code Online (Sandbox Code Playgroud)\n\n是否有现有工具可以根据我当前安装的软件包以编程方式更新依赖项的版本?
\n\n我知道这是一件小事,我可以手动完成,但我只知道这是一种很容易忘记的事情。
\n\n使用包的本地安装版本作为最小依赖项似乎也有意义,因为我使用这些依赖项进行了测试/构建。
\n\n我有理由不应该这样做吗?
\n另一种选择是使用usethis包,尽管这实际上会立即覆盖描述文件,所以不确定这是否总是需要的
# use overwrite = TRUE to update dependencies with version numbers
usethis::use_latest_dependencies(overwrite = TRUE, source = "CRAN")
Run Code Online (Sandbox Code Playgroud)
这应该按照您的要求进行(好吧,您仍然需要将输出剪切/粘贴到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")
})
}
Run Code Online (Sandbox Code Playgroud)
您的其中一个包裹:
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)
Run Code Online (Sandbox Code Playgroud)
只是为了显示边缘情况的处理:
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)
Run Code Online (Sandbox Code Playgroud)