4 min read

rversions 1.1.0 is on CRAN!

Version 1.1.0 of the rversions package has been released on CRAN! rversions queries the main R SVN repository to find the versions r-release and r-oldrel refer to, and also all previous R versions and their release dates.

Get rversions’s latest version from a safe CRAN mirror near you:

install.packages("rversions")

This release, compared to rversions 1.0.3, brings

  • ✨ caching ✨ of the R versions within each R session (less useless queries!) thanks to a contribution by Rich FitzJohn;

  • ✨ version nicknames ✨ information to the output of rversions functions;

  • a documentation website built with pkgdown;

  • and a new home for rversions’ source from METACRAN to R-hub! 🏠

That’s it, but since it’s the first time we blog about rversions, we’ll use the release as an opportunity to introduce it with all due respect! How does rversions work and what is it useful for?

Where does rversions get its information from?

As you might have guessed, R is developed under version control. The R Core team uses SVN, i.e. Apache Subversion. The versions rversions outputs are derived from SVN tags in the main R SVN repository. In SVN lingo, “tagging refers to labeling the repository at a certain point in time so that it can be easily found in the future.” so it might remind you of git tags (or of GitHub releases). In more details,

head(rversions::r_versions())
  version                date nickname
1    0.60 1997-12-04 08:47:58     <NA>
2    0.61 1997-12-21 13:09:22     <NA>
3  0.61.1 1998-01-10 00:31:55     <NA>
4  0.61.2 1998-03-14 19:25:55     <NA>
5  0.61.3 1998-05-02 07:58:17     <NA>
6    0.62 1998-06-14 12:56:20     <NA>
  • r-release is the latest SVN tag
rversions::r_release()
    version                date  nickname
117   4.0.0 2020-04-24 07:05:34 Arbor Day
  • r-oldrel is the latest of the previous minor version
rversions::r_oldrel()
    version                date             nickname
116   3.6.3 2020-02-29 08:05:16 Holding the Windsock
  • r-release-tarball is the latest SVN tag that has a corresponding tar.gz to download
rversions::r_release_tarball()
    version                date
116   3.6.3 2020-02-29 08:05:16
                                                       URL             nickname
116 https://cran.r-project.org/src/base/R-3/R-3.6.3.tar.gz Holding the Windsock
  • Windows, macOS are the same: latest SVN tag that has a file to download
rversions::r_release_win()
    version                date
117   4.0.0 2020-04-24 07:05:34
                                                            URL  nickname
117 https://cran.r-project.org/bin/windows/base/R-4.0.0-win.exe Arbor Day
rversions::r_release_macos()
    version                date
117   4.0.0 2020-04-24 07:05:34
                                                  URL  nickname
117 https://cran.r-project.org/bin/macosx/R-4.0.0.pkg Arbor Day

Version nicknames are extracted from specific files from R 2.15.1, e.g. https://svn.r-project.org/R/tags/R-2-15-1/VERSION-NICK. Before that there were only 3 version nicknames, which we got from Lucy D’Agostino McGowan’s excellent blog post about R release names, where you can also read about their meaning.

Where is rversions used?

rversions is used in R packages but also public services for R package developers, including R-hub of course!

In R packages

  • rversions is used in devtools, in dr_devtools() to compare the installed R version to the current R release version.

  • provisionr imports rversions and uses it in check_r_version(), a function that checks and coerces something into an R version.

In other tools

In the tools mentioned below, rversions is used via its very own web service.

Can we also play with rversions data?

At this point, you have no doubt rversions is useful, but what about we use it to get a glimpse at R’s release schedule over time?

library("ggplot2")
versions <- rversions::r_versions()
versions <- dplyr::mutate(versions, date = anytime::anytime(date))
versions <- tidyr::separate(versions, version,
                            into = c("major", "minor", "patch"))
Warning: Expected 3 pieces. Missing pieces filled with `NA` in 13 rows [1, 2, 6,
11, 15, 18, 20, 22, 23, 25, 27, 31, 33].
versions <- dplyr::mutate(versions, patch = ifelse(is.na(patch), 0, patch))
versions <- dplyr::mutate(versions, release = dplyr::case_when(
  major != dplyr::lag(major) ~ "major",
  minor != dplyr::lag(minor) ~ "minor",
  TRUE ~ "patch"
))

ggplot(versions) +
  geom_segment(aes(x = date, xend = date,
                 col = release), 
                   y = 0, yend = 1) +
  viridis::scale_colour_viridis(discrete = TRUE) +
  theme_minimal() +
  hrbrthemes::theme_ipsum(base_size = 16,
                          axis_title_size = 16) +
  xlab("Time") + 
  theme(
  axis.text.y = element_blank(),
  axis.ticks.y = element_blank(),
  axis.title.y = element_blank(),
  legend.position = "bottom") +
  ggtitle("R releases over time",
          subtitle = "Data obtained via the R-hub rversions R package")

With the R version being x.y.z, we define a major release as a change in x, a minor release as a change in y and a patch release as a change in z. The figure above shows that the frequency of minor releases decreased in 2013, from twice to once a year. The frequency of patch releases seems irregular, as is the frequency of major releases: not sure when we should expect R 4.0.0!

Conclusion

The best place to get to know rversions is its brand-new documentation website built with pkgdown, and the best place to provide feedback or contribute is its GitHub repo. Thanks to all folks who chimed in in the issue tracker and pull request tab!