KevCaz's Website

I always forget how to convert Fahrenheit to Celsius and conversely, which I find very frustrating – for the record the current definition is:

$$T(°F) = T(°C)\frac{9}{5}+32$$

Yesterday, after looking for the umpteenth times the above equation I decided to create a small function that would handle the conversion. I first thought that I could create a 2-lines function just for this specific unit conversion when I realize that there is a R 📦 dedicated to units manipulation: units that depends on the C library libdunits2 and is required to install 📦 sf. After a couple of minutes reading the documentation 📖, I figured out how to create a simple but robust unit converter with one line of code, and so I did:

1
2
3
R> conv <- function(x, from = "fahrenheit", to = "celsius") {
      units::as_units(0, to) + units::as_units(as.numeric(x), from)
    }

I appended this function to my .Rprofile and now, it is available when I work with R. Here are a couple of examples:

1
2
3
4
5
6
7
8
9
# Fahrenheit => Celsius (default)
R> conv(350)
176.6667 [°C]
# Day => second
R> conv(1.5, "d", "s")
129600 [s]
# calorie => Joule
R> conv(1, "cal", "J")
4.1868 [J]

I also created a shell function calling the R function above, so that I quickly convert units in a Terminal!

1
2
3
4
5
6
# shell function
convR() {
  FROM=${2:-fahrenheit}
  TO=${3:-celsius}
  Rscript -e "conv('$1', '$FROM', '$TO')"
}

For instance:

1
2
3
4
$ convR 420
215.5556 [°C]
$ convR 3600 km/h m/s
1000 [m/s]

I will likely use littler to call the R function in a shell and if I do so, I will report how to on this site!