如何以编程方式检查当前安装的R是否是最新版本?

4

如何从R的层面检查当前安装的R是否是最新版本?找到已安装R的版本很容易,但如何检查最新版本的编号?这种信息可以通过CRAN获得吗?


1
它在CRAN上。你想知道如何在R内部进行检查吗? - Thomas
@Thomas,是的 - 如何在R中检查它? - Qbik
2个回答

5

我在我最喜欢的搜索引擎中快速搜索到了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

1
它也在R-FAQs中列出:http://cran.r-project.org/doc/FAQ/R-FAQ.txt,在短语“The current released version is”之后。 - Thomas

3
您可以使用来自gtools的方法。
代码与Andrie的答案类似,但明确使用了/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 - andreister
library(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
我的意思是你可以将这个功能集成到你的代码中,使其跨主要版本具有灵活性(检查下一个主要版本是否存在,如果不存在,则获取最近的次要版本)。 - Thomas
1
有道理 - 我更新了答案,现在看起来更灵活 :) - andreister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接