versionsort
is a lightweight, dependency-free package
for sorting version codes. Version codes are considered to be strings of
alphanumeric characters split into components by special characters
acting as separators; most commonly a dot .
or a dash
-
, but others are allowed as well.
Can’t I use base sort function?
Base sort()
is not suited to the task of sorting version
codes. It sorts strings alphabetically, placing 1.0.10
between 1.0.1
and 1.0.2
, for example.
ver_sort()
places it behind 1.0.9
instead.
What about less known base functions that handle version codes?
There are functions like numeric_version()
and
compareVersion()
. They are, however, much more limited in
that they accept only numerical components in version codes.
versionsort
can handle letters, even if concatenated with
numbers, allowing the user to work with version codes like
1.8b0a
and 0.3-10vcd1-devel
. It correctly
detects 8
and 10
in these examples, placing
these versions behind codes like 1.8.5
and
0.3-10
respectively.
And what about other R packages?
I’m not aware of any R package providing this functionality. Even if
there is any, versionsort
is designed to have simple,
intuitive API with all functions having the same naming scheme of
ver_xxx()
, reducing the risk of name clash. Moreover,
package developers should appreciate the strict “no dependencies”
policy, so that importing versionsort
inside their packages
won’t create indirect dependencies on another five or ten libraries.
# Install from CRAN:
install.packages("versionsort")
# Install the development version from GitHub:
# install.packages("devtools")
::install_github("ErdaradunGaztea/versionsort") devtools
versionsort
has two main functions, mimicking base R
division: vec_order()
and vec_sort()
.
library(versionsort)
<- c("1.5-0", "1.4-1", "0.0.0.9000", "1.4-0a", "1.4-0")
version_codes ver_order(version_codes)
# The two lines below are equivalent (but use the latter for code readability, whenever possible)
ver_order(version_codes)]
version_codes[ver_sort(version_codes)
There are also two functions dedicated to finding the code of the
latest/oldest version, aptly named vec_latest()
and
vec_oldest()
.
# We can reuse already defined vector of version codes
<- c("1.5-0", "1.4-1", "0.0.0.9000", "1.4-0a", "1.4-0")
version_codes ver_latest(version_codes)
vec_oldest(version_codes)
I believe in equal rights and treatment for everybody, regardless of
their sexuality, gender identity, skin tone, nationality, and other
features beyond human control. Thus, I do not allow
versionsort
to be used in any project that promotes hate
based on the aforementioned factors.