在文档中我希望能够引用CRAN上安装的软件包的版本,该版本可能落后于我当前安装的版本。
我可以使用
available.packages()
来做到这一点,但这会下载整个CRAN包列表(350K行,10Mb),所以我想知道是否有更简单的东西。
#' Find version of a package on CRAN
cran_version <- function(package) {
avail <- utils::available.packages(filters = "CRAN")
avail <- avail[, c("Package", "Version")]
which <- avail[, "Package"] == package
avail[which, "Version"]
}
> packageVersion("heplots")
[1] ‘1.6.3’
> cran_version("heplots")
[1] "1.6.2"
这个怎么样?
PACKAGES <- tempfile(fileext = "rds")
pkgversion <- function(package) {
# Get list of packages from CRAN if
#
# - don't have local copy or
# - local copy more than 5 minutes old.
#
if (
!file.exists(PACKAGES) ||
difftime(Sys.time(), file.mtime(PACKAGES), unit = "mins") > 5
) {
download.file(
"cran.r-project.org/src/contrib/PACKAGES.rds",
PACKAGES,
quiet = FALSE
)
}
# Read and convert to data frame.
packages <- readRDS("PACKAGES.rds") |> data.frame()
# Filter for specified package and return version.
packages[packages$Package == package,]$Version
}
您可以使该功能更加健壮和高效,但这已经完成了工作。
输出示例:
> pkgversion("dplyr")
trying URL 'cran.r-project.org/src/contrib/PACKAGES.rds'
Content type 'unknown' length 953040 bytes (930 KB)
==================================================
downloaded 930 KB
[1] "1.1.4"
> pkgversion("ggplot2")
[1] "3.5.1"
> pkgversion("tidyr")
[1] "1.3.1"