lobstr provides tools in the same vein as str()
, which
allow you to dig into the detail of an object.
Install the released version of lobstr from CRAN:
install.packages("lobstr")
You can install the development version with:
# install.packages("devtools")
::install_github("r-lib/lobstr") devtools
ast()
draws the abstract syntax tree of R
expressions:
ast(a + b + c)
#> █─`+`
#> ├─█─`+`
#> │ ├─a
#> │ └─b
#> └─c
ast(function(x = 1) {
if (x > 0) print("Hi!")
})#> █─`function`
#> ├─█─x = 1
#> ├─█─`{`
#> │ └─█─`if`
#> │ ├─█─`>`
#> │ │ ├─x
#> │ │ └─0
#> │ └─█─print
#> │ └─"Hi!"
#> └─<inline srcref>
ref()
shows hows objects can be shared across data
structures by digging into the underlying __ref__erences:
<- 1:1e6
x <- list(x, x, x)
y ref(y)
#> █ [1:0x7fed114eaea8] <list>
#> ├─[2:0x7fed21f373b8] <int>
#> ├─[2:0x7fed21f373b8]
#> └─[2:0x7fed21f373b8]
<- rlang::env()
e $self <- e
eref(e)
#> █ [1:0x7fecf1856f00] <env>
#> └─self = [1:0x7fecf1856f00]
A related tool is obj_size()
, which computes the size of
an object taking these shared references into account:
obj_size(x)
#> 680 B
obj_size(y)
#> 760 B
cst()
shows how frames on the call stack are
connected:
<- function(x) g(x)
f <- function(x) h(x)
g <- function(x) x
h f(cst())
#> ▆
#> 1. ├─global f(cst())
#> 2. │ └─global g(x)
#> 3. │ └─global h(x)
#> 4. └─lobstr::cst()