Following my recent post on three useful (to me) R patterns, I’ve written down three other things on a tiny sticky note. This post will allow me to throw away this beaten down sticky note, and maybe to show you one element you didn’t know?
nzchar(): “a fast way to find out if elements of a character vector are non-empty strings”
One of my favorite testing technique is the escape hatch strategy, about which I wrote a post on the R-hub blog: you make part of your code responsive to an environment variable, and you locally set that environment variable in your tests. In your code, to determine whether the environment variable has been set to something, anything, you can use the
nzchar("Hello World") #>  TRUE nzchar("") #>  FALSE nzchar(NA) #>  TRUE nzchar(NA, keepNA = TRUE) #>  NA # Now with an environment variable nzchar(Sys.getenv("blopblopblop")) #>  FALSE withr::with_envvar( new = c("blopblopblop" = "bla"), nzchar(Sys.getenv("blopblopblop")) ) #>  TRUE
Allow me to mention the obvious: if you’re using
nzchar() to examine an environment variable, do not forget
Sys.getenv(). I spent too much time looking at the following piece of code last week:
nzchar("BABELQUARTO_TESTS_URL") wondering why it didn’t do what I expected it to do… I had to replace it with
The backports R package, and its README
R is quite stable to say the least, but useful new functions have been added to it over time. For instance, R 3.3.0 saw the birth of
trimws(), that trims white space.
trimws(c("useless whitespace ", " all around ")) #>  "useless whitespace" "all around"
To use such functions in your package, you might need to set a dependency on a recent version of R, making it harder for users with restrictive rights on their R install, to use your package. The backports R package can help you avoid to set that dependency: it provides backports for these useful new functions. The README explains how to set up its usage.
I like both the existence of backports and its README because it is a list of these newer functions! I can’t pretend I’m a hipsteR but there are gems I forget or never heard about. Reading the list helps me see what’s there! For similar reasons I find the reference index of the lintr package to be a treasure trove.
Using the first non-missing thing: coalescing
Sometimes you might have an ordered “wish list” in your code: use A, then if A is missing, use B, then if B is missing, use C, and so on and so forth until a default value or error. The pkgdown package for instance has a function called
I only recently realized this idea is usually called coalescing. dplyr has a
“Given a set of vectors, coalesce() finds the first non-missing value at each position. It’s inspired by the SQL COALESCE function which does the same thing for SQL NULLs.”
I know close to NULL about SQL, but I did notice the
COALESCE function in another query language, SPARQL, for which Lise Vaudor and I are working on a DSL, meaning a helper package, called glitter.
It makes me very happy to learn such an useful new word, or at least it usage in the programming realm.
After writing a bit about
nzchar(), the backports package and the idea of coalescence, I can now throw away my sticky note! Let’s see what makes its way onto a new sticky note…