17.3 Code is a tree
To do more complex manipulation with expressions, you need to fully understand their structure. Behind the scenes, almost every programming language represents code as a tree, often called the abstract syntax tree, or AST for short. R is unusual in that you can actually inspect and manipulate this tree.
A very convenient tool for understanding the tree-like structure is
lobstr::ast(). Given some code, this function displays the underlying tree structure. Function calls form the branches of the tree, and are shown by rectangles. The leaves of the tree are symbols (like
a) and constants (like
::ast(f(a, "b")) lobstr#> █─f #> ├─a #> └─"b"
Nested function calls create more deeply branching trees:
::ast(f1(f2(a, b), f3(1, f4(2)))) lobstr#> █─f1 #> ├─█─f2 #> │ ├─a #> │ └─b #> └─█─f3 #> ├─1 #> └─█─f4 #> └─2
Because all function forms can be written in prefix form (Section 6.8.2), every R expression can be displayed in this way:
::ast(1 + 2 * 3) lobstr#> █─`+` #> ├─1 #> └─█─`*` #> ├─2 #> └─3
Displaying the AST in this way is a useful tool for exploring R’s grammar, the topic of Section 18.4.