terse
is an alternative to str()
that aims to be more succinct for
simple objects.
It was built with (nested) list
output in mind, but handles
data.frames
and many other standard data structures in R.
- Compact output
- ANSI colour (configurable)
- Alignment of indexes at start of each row, such that names at the same depth are aligned under each other
- Alignment of values within data.frames
- Ability to select+copy+paste the path to a particular element
- Currently supports the standard vector types and lists
- Lists are always recursed in to (there is currently no option to limit the recursion depth)
- Weirder data structures might not work how you want - e.g. list-columns in data.frames, R6 objects etc.
If you find a common case that doesn’t produce nice output, please file an issue (or PR!).
You can install from GitHub with:
# install.packages("devtools")
devtools::install_github("coolbutuseless/terse")
Simple data.frame output
library(terse)
terse(mtcars)
Click here to show/hide - Comparison to str() and glimpse()
str(mtcars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
dplyr::glimpse(mtcars)
Rows: 32
Columns: 11
$ mpg <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8…
$ cyl <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8…
$ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 1…
$ hp <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 18…
$ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92…
$ wt <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3…
$ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 1…
$ vs <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0…
$ am <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0…
$ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3…
$ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2…
Simple data.frame output without ANSI
terse(mtcars, config = list(ansi = FALSE), width = 100)
mtcars$mpg d32 21 , 21 , 22.8 , 21.4 , 18.7 , 18.1 , 14.3 , 24.4 , 22.8 , 19.2 , 17.8 , 16 ...
mtcars$cyl d32 6 , 6 , 4 , 6 , 8 , 6 , 8 , 4 , 4 , 6 , 6 , 8 ...
mtcars$disp d32 160 , 160 , 108 , 258 , 360 , 225 , 360 , 146.7, 140.8, 167.6, 167.6, 27 ...
mtcars$hp d32 110 , 110 , 93 , 110 , 175 , 105 , 245 , 62 , 95 , 123 , 123 , 18 ...
mtcars$drat d32 3.9 , 3.9 , 3.85 , 3.08 , 3.15 , 2.76 , 3.21 , 3.69 , 3.92 , 3.92 , 3.92 , 3. ...
mtcars$wt d32 2.62 , 2.875, 2.32 , 3.215, 3.44 , 3.46 , 3.57 , 3.19 , 3.15 , 3.44 , 3.44 , 4. ...
mtcars$qsec d32 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20 , 22.9 , 18.3 , 18.9 , 17 ...
mtcars$vs d32 0 , 0 , 1 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 1 , 0 ...
mtcars$am d32 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ...
mtcars$gear d32 4 , 4 , 4 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 3 ...
mtcars$carb d32 4 , 4 , 1 , 1 , 2 , 1 , 4 , 2 , 2 , 4 , 4 , 3 ...
ll <- list(
apple = list(
bob = list(c = 1:3),
c = list(
list(d = head(mtcars))
),
ddd = setNames(1:26, letters)
)
)
terse(ll, config = list(nth = 4, colour_nth = 'red'))
Click here to show/hide - Comparison to str()
str(ll)
List of 1
$ apple:List of 3
..$ bob:List of 1
.. ..$ c: int [1:3] 1 2 3
..$ c :List of 1
.. ..$ :List of 1
.. .. ..$ d:'data.frame': 6 obs. of 11 variables:
.. .. .. ..$ mpg : num [1:6] 21 21 22.8 21.4 18.7 18.1
.. .. .. ..$ cyl : num [1:6] 6 6 4 6 8 6
.. .. .. ..$ disp: num [1:6] 160 160 108 258 360 225
.. .. .. ..$ hp : num [1:6] 110 110 93 110 175 105
.. .. .. ..$ drat: num [1:6] 3.9 3.9 3.85 3.08 3.15 2.76
.. .. .. ..$ wt : num [1:6] 2.62 2.88 2.32 3.21 3.44 ...
.. .. .. ..$ qsec: num [1:6] 16.5 17 18.6 19.4 17 ...
.. .. .. ..$ vs : num [1:6] 0 0 1 1 0 1
.. .. .. ..$ am : num [1:6] 1 1 1 0 0 0
.. .. .. ..$ gear: num [1:6] 4 4 4 3 3 3
.. .. .. ..$ carb: num [1:6] 4 4 1 1 2 1
..$ ddd: Named int [1:26] 1 2 3 4 5 6 7 8 9 10 ...
.. ..- attr(*, "names")= chr [1:26] "a" "b" "c" "d" ...
The output consists of 3 sections:
- Names and indices (on the left)
- Compact type + length information
- Vectors of values (on the right)
The green output consists of a single character for type information, followed by a length (the number of elements in this vector)
Click to show/hide list of all type information
- a - array
- m - matrix
- l - logical
- f - factor
- p - POSIXct
- P - POSIXlt
- D - Date
- n - name
- i - integer
- d - double
- r - raw
- c - character
- C - complex
- N - null
- K - call
- F - function
- E - environment
- e - expression
- L - list
- x - unknown
terse()
takes a config
argument which must be a named list. Possible
elements are:
ansi
- Use ANSI colouring? default:TRUE
soft
- non-highlight colour. default:grey40
gsep
- separator for vector output. default:,
colour_nth
- colour for every nth vector element. default:blue4
colour_all
- colour for all other vector elements. default:grey40
colour_type
- colour for the type/length meta information. default:seagreen
nth
- interval for colouring vector elements. default:0
(off)
- Base R utils::str()
- dplyr::glimpse()
- R Core & CRAN maintainers for giving me a playground
- Brodie Gaslam for the excellent ANSI tools in fansi
- Deemah and Jonathan Carroll for helping me find a good name