For many R users the
magrittr pipe is a popular way to arrange computation and famously part of the
tidyverse itself is a rapidly evolving centrally controlled package collection. The
tidyverse authors publicly appear to be interested in re-basing the
tidyverse in terms of their new
tidyeval package. So it is natural to wonder: what is the future of
magrittr (a pre-
tidyeval package) in the
For instance: here is a draft of
tidyeval based pipe (from one of the primary
tidyeval authors). This pipe even fixes
dplyr issue 2726:
# do NOT perform the source step directly! # Instead, save and inspect the source code from: # https://gist.github.com/lionel-/10cd649b31f11512e4aea3b7a98fe381 # Output printed is the result of an example in the gist. source("https://gist.githubusercontent.com/lionel-/10cd649b31f11512e4aea3b7a98fe381/raw/b8804e41424a4f721ce21292a7ec9c35b5f3689d/pipe.R") #> List of 1 #> $ :List of 1 #> ..$ :List of 2 #> .. ..$ : chr "foo" #> .. ..$ : chr "foo" # previously throwing example from dplyr issue 2726 (function(x) mtcars %>% dplyr::select(!!enquo(x)))(disp) %>% head() #> disp #> Mazda RX4 160 #> Mazda RX4 Wag 160 #> Datsun 710 108 #> Hornet 4 Drive 258 #> Hornet Sportabout 360 #> Valiant 225
Data Scientist and trainer at Win Vector LLC. One of the authors of Practical Data Science with R.
lionel’s code makes my head spin. It would be amazing to have some kind of deep dive blog post showing how you even begin to write something like this.
Actually Lionel Henry’s code is sequenced in good “form follows function style” (once you ignore the preparation steps). The difficult bit is only somebody very versed in the internals of
tidyevalcan work out what the preparation steps do and which ones would be needed.
magrittrcode itself is incredibly compact for what it does, as it uses the powerful idea of traversing the parse tree and hanging different effects as it visits different bits of the tree. But that makes it a bit hard to immediately figure out how things interact.
My code is simple “does what it says on the label” code, but that isn’t always a bad thing. One has to know some
Rarcana (i.e., that
substitute()captures unevaluated arguments), but that is standard for
Rif you try to directly manipulate calculations.
No criticism of lionel’s code was meant – it’s all just way above my level :)
My fault- I figure they are already sick of me and want to be extra sensitive to what is said and what could be misread.