---
layout: post
title:  "Measurement units in R now simplify"
date:  "`r format(Sys.time(), '%d %B, %Y')`"
comments: true
author: Edzer Pebesma
categories: r
---

TOC

[DOWNLOADHERE]

I wrote earlier about the [units](https://cran.r-project.org/web/packages/units/index.html) R package in [this blog post](http://r-spatial.org/r/2016/06/10/units.html). Last weekend I was happily surprised by two large pull requests ([1](https://github.com/edzer/units/pull/2), [2](https://github.com/edzer/units/pull/3)), from [Thomas Mailund](http://www.mailund.dk/index.php/about/). He discusses his contribution in [this blog](http://www.mailund.dk/index.php/2016/08/14/adding-units-as-types-to-numbers-in-r/).

Essentially, the pull requests enable

* the handling and definition of user-defined units in R, and
* automatic simplification of units

### How it works

Units now have to be created explicitly, e.g. by

```{r}
library(units)
m = make_unit("m")
s = make_unit("s")
(a = 1:10 * m/s)
```

The units of the [udunits2](https://cran.r-project.org/web/packages/udunits2/index.html) package are no longer loaded automatically; they are in a database (list) called `ud_untis`, which is lazyloaded, so after 

```{r}
rm("m", "s")
```

two clean solutions to use them are  either

```{r}
(a = 1:10 * ud_units$m / ud_units$s)
```

or

```{r}
(with(ud_units, a <- 1:10 * m / s))
```

and one much less clean solution is to first attach the whole database:

```{r}
attach(ud_units)
(a = 1:10 * m / s)
```

### Simplification

Simplification not only works when identical units appear in both numerator and
denominator:
```{r}
a = 1:10 * m / s
a * (10 * s)
```
but also when a unit in the numerator and denominator are convertible:
```{r}
a = 1:10 * m / s
a * (10 * min)
a / (0.1 * km)
```

### New units

New units can be created on the fly, and are simplified:
```{r}
apple = make_unit("apple")
euro = make_unit("euro")
(nr = c(5, 10, 15) * apple)
(cost_per_piece = 0.57 * euro / apple)
(cost = nr * cost_per_piece)
```

### Limitations

Two limitations of the current [implementation](https://github.com/edzer/units) are

1. automatic conversion of user-implemented units into other user-defined units or to and from units in the `ud_units` database is not supported,
1. non-integer powers are no (longer) supported.
