如何从R的层面检查当前安装的R是否是最新版本?找到已安装R的版本很容易,但如何检查最新版本的编号?这种信息可以通过CRAN获得吗?
我在我最喜欢的搜索引擎中快速搜索到了Yihui Xie的这篇文章,并将其转化为一个函数:
checkRversion <- function(){
x = readLines("http://cran.r-project.org/sources.html")
# the version number is in the next line of 'The latest release'
rls = x[grep("latest release", x) + 1L]
newver = gsub("(.*R-|\\.tar\\.gz.*)", "", rls)
oldver = paste(getRversion(), collapse = ".")
# new version available?
message("Installed version: ", oldver)
message("Latest version: ", newver)
compareVersion(newver, oldver)
}
使用中:
checkRversion()
Installed version: 3.0.1
Latest version: 3.0.1
[1] 0
gtools
的方法。/src/base/R
文件夹,而不是sources.html
文件,因此更加健壮,因为它依赖于实际二进制文件的存在。gtools
硬编码了文件夹名称,所以他们的代码是错误的 - 但我很喜欢这个想法,所以我更新了它,通过可用的CRAN urls并找到最新的那一个进行迭代。checkRVersion <- function (quiet = FALSE)
{
baseUrl <- "http://cran.r-project.org/src/base/R-"
majorVersion <- 3
repeat {
url <- paste(baseUrl, majorVersion, sep = "")
if (url.exists(url)) {
majorVersion <- majorVersion + 1
}
else {
break
}
}
url <- paste(baseUrl, (majorVersion-1), sep = "")
page <- scan(file = url, what = "", quiet = TRUE)
matches <- grep("R-[0-9]\\.[0-9]+\\.[0-9]+", page, value = TRUE)
versionList <- gsub("^.*R-([0-9].[0-9]+.[0-9]+).*$", "\\1", matches)
versionList <- numeric_version(versionList)
if (max(versionList) > getRversion()) {
if (!quiet) {
cat("A newer version of R is now available: ")
cat(as.character(max(versionList)))
cat("\n")
}
invisible(max(versionList))
}
else {
if (!quiet) {
cat("The latest version of R is installed: ")
cat(as.character(max(versionList)))
cat("\n")
}
invisible(NULL)
}
}
sources.html
就不那么麻烦了 - 我会保留我的答案,以防有人在这里遇到 gtools
。 - andreisterlibrary(RCurl)
开始,你也可以执行 url.exists("http://cran.r-project.org/src/base/R-3")
和 url.exists("http://cran.r-project.org/src/base/R-4")
,等等,直到你得到一个 FALSE
。 - Thomas