knitr::opts_chunk$set( collapse = FALSE, comment = NULL ) options(cli.unicode = FALSE) options(crayon.enabled = TRUE) ansi_aware_handler = function(x, options) { paste0( "<pre class=\"r-output\"><code>", fansi::sgr_to_html(x = x, warn = FALSE, term.cap = "256"), "</code></pre>" ) } knitr::knit_hooks$set( output = ansi_aware_handler, message = ansi_aware_handler, warning = ansi_aware_handler, error = ansi_aware_handler ) knitr::opts_chunk$set( collapse = TRUE, # comment = "#>", comment = NA, # fig.path = "man/figures/README-", out.width = "100%" ) library(tabstats)
{tabstats} is a lightweight package for displaying data in clean, formatted tables directly in the console. It is mainly designed for developers who wants to display their outputs (preferably in a data frame object), and to make the output readable at a glance, configurable without boilerplate, and friendly to interactive workflows.
The package provides four main functions:
| Function | Purpose |
|-------------------|--------------------------------------------|
| table_default() | General-purpose data frame table |
| table_summary() | Two-column key-value summary table |
| corr_matrix() | Correlation matrix display |
| cross_table() | Cross tabulation with optional percentages |
All functions share a common design philosophy:
style = list(...) argument that accepts either predefined style strings (e.g. "blue_bold") or plain lambda functions (e.g. \(x) cli::col_red(x)).align argument that accepts a single string, a length-2 vector, or a named list.center_table = TRUE, which automatically pads the output to the middle of your terminal.Install the following package from CRAN:
install.packages("tabstats")
Or install the development version from GitHub:
# install.packages("pak") pak::pak("joshuamarie/tabstats") ## devtools::install_github("joshuamarie/tabstats")
The main API of this package displays the data you wanted to display into a specific format
table_default()Data frames usually looks like this when displayed:
head(mtcars[, 1:5], 5)
With table_default(), the data frame is now displayed in an APA-style format, with configurable formatting.
table_default(head(mtcars[, 1:5], 5))
table_summary()Another form of table_default(), except it is best suitable for displaying summarized data, where it requires 2 columns data frame. The simplest use case is a named summary of values, like model diagnostics or descriptive statistics, where the 1st column is the name of the parameter (statistic) while the 2nd column is the estimate.
df = data.frame( Statistic = c("N", "Mean", "SD", "Min", "Max"), Value = c("100", "3.45", "1.20", "1.00", "6.00") ) table_summary( df, title = "Descriptive Statistics", header = TRUE )
*The header means you still wanted to display the column names from the original df data frame, otherwise, no column names are present. *
corr_matrix()A much complex but niche function to display the matrix, specifically designed for correlation matrices. If the display is a correlation matrix, typically the output of cor(), you can directly pass it.
corr_matrix(cor(mtcars[, 1:4]), method = "Pearson")
But, if the data you wanted to display is not a matrix, but on another form, you're going to have to configure it by building a custom spec with new_corr_data() for full control over which values to appear.
A wild example, assuming you want to display the output from rstatix::cor_test():
cor_mat = iris |> rstatix::cor_test(Sepal.Width, Sepal.Length, Petal.Length) |> dplyr::mutate( var1, var2, cor = format(cor, digits = 2), statistic = format(statistic, digits = 2), conf_int = paste0( "[", format(conf.low, digits = 2), ", ", format(conf.high, digits = 2), "]" ), .keep = "unused" ) cor_mat |> with({ corr_matrix( new_corr_data( var1 = var1, var2 = var2, corr = cor, statistic = statistic, pval = p, conf_int = conf_int ), title = "Pearson Correlation Matrix" ) })
cross_table()Another nice function to display the matrices — contingency tables, to be exact. It has (almost) everything to display the contingency table, including the observed frequencies, expected values, and percentages side by side.
m = matrix( c(10, 20, 30, 40), nrow = 2, dimnames = list( c("A", "B"), c("X", "Y") ) ) cross_table(m, percentage = "all")
All table functions provides an API to style the table.
table_default() has 2 parameters: style_colnames to style the column names you wanted to design, and style_columns if you want to apply the style to the entire column you choose to style. Use td_style() to configure the style of the column you choose to style.
table_summary() has a style parameter to configure the style of the specific column you wanted to design. Use sm_style() to configure the style of the specific column.
cross_table() has a style parameter to configure the style of the data displayed by the function. Use ct_style() to configure the style of the displayed values.
corr_matrix() has a style parameter to configure the style of the values you entered, typically from the display argument using new_corr_data(). Use cm_style() to configure those values you assigned into new_corr_data() into the displayed table.
The quickest way to style output is with a named string:
table_summary( df, title = "Descriptive Statistics", header = TRUE, style = sm_style( left_col = "blue_bold", right_col = "green", title = "bold", sep = ": " ) )
For full control, pass a lambda instead — it receives the text as its argument:
table_summary( df, title = "Descriptive Statistics", header = TRUE, style = sm_style( left_col = \(x) cli::col_red(cli::style_bold(x)), right_col = \(x) cli::col_cyan(x), title = "bold", sep = ": " ) )
Hex codes are also supported:
table_summary( df, title = "Descriptive Statistics", header = TRUE, style = sm_style( left_col = function(x) { red = cli::make_ansi_style("#BD4444") red(cli::style_bold(x)) }, right_col = \(x) { bluish_color = cli::make_ansi_style("#67A2C5") bluish_color(x) }, title = "bold", sep = ": " ) )
Supported named style strings:
| String | Effect |
|------------------------------------------|-------------------------------------|
| "bold" | Bold text |
| "italic" | Italic text |
| "blue", "red", "green", "yellow" | Foreground colour |
| "blue_bold" | Colour + bold (combinable with _) |
| "red_italic" | Colour + italic |
More example: Imagine you want to apply for the p-value of the output from rstatix::cor_test(), an earlier example. In corr_matrix(), you can even conditionally format the specified value from new_corr_data().
cor_mat |> with({ corr_matrix( new_corr_data( var1 = var1, var2 = var2, corr = cor, statistic = statistic, pval = p, conf_int = conf_int ), title = "Pearson Correlation Matrix", style = cm_style( pval = function(x) { x_num = as.numeric(x) if (is.na(x_num) || x_num > 0.05) { cli::style_italic(x) } else if (x_num > 0.01) { reddish = cli::make_ansi_style("#CE2626") reddish(x) # or just cli::col_red(x) } else { cli::style_bold("<0.001") } } ) ) })
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.