| Title: | Dynamically Generate Tabset Panels in 'Quarto' HTML Documents |
| Version: | 0.1.1 |
| Description: | Dynamically generate tabset panels https://quarto.org/docs/output-formats/html-basics.html#tabsets in 'Quarto' HTML documents using a data frame as input. |
| License: | MIT + file LICENSE |
| URL: | https://sayuks.github.io/quartabs/, https://github.com/sayuks/quartabs |
| BugReports: | https://github.com/sayuks/quartabs/issues |
| Imports: | stats |
| Suggests: | altdoc, dplyr (≥ 1.0.0), DT, flextable, gt (≥ 0.9.0), htmltools, knitr, plotly, purrr, quarto, reactable, sessioninfo, spelling, testthat (≥ 3.0.0), tibble, tidyr, tinytable, utils |
| Config/testthat/edition: | 3 |
| Encoding: | UTF-8 |
| Language: | en-US |
| RoxygenNote: | 7.3.2 |
| NeedsCompilation: | no |
| Packaged: | 2025-03-31 01:55:39 UTC; ysasa |
| Author: | Yusuke Sasaki [aut, cre] |
| Maintainer: | Yusuke Sasaki <sayuks.dev@gmail.com> |
| Repository: | CRAN |
| Date/Publication: | 2025-03-31 02:20:02 UTC |
Dynamically Generate Tabset Panels in Quarto HTML Documents
Description
render_tabset() takes a data frame as input and outputs the markdown
that generates the tabset
to stdout (console). Only works with Quarto HTML documents.
See Get started for details.
Usage
render_tabset(
data,
tabset_vars,
output_vars,
layout = NULL,
heading_levels = NULL,
pills = FALSE,
tabset_width = "default"
)
Arguments
data |
A data frame. |
tabset_vars |
Columns to use as tabset labels. Internally passed
to the |
output_vars |
Columns to display in each tabset panel. Internally
passed to the |
layout |
|
heading_levels |
|
pills |
Logical, use pills or not.
See https://getbootstrap.com/docs/5.2/components/navs-tabs/#pills
for details. If |
tabset_width |
Character, one of "default", "fill" and "justified".
See https://getbootstrap.com/docs/5.2/components/navs-tabs/#fill-and-justify
for details. If |
Details
Write
#| results: asisat the beginning of the chunk orresults='asis'in the chunk options.If multiple
tabset_varsare given, create nested tabsets.For columns specified in
output_vars, columns of type list are output withprint()and normal columns are output withcat().The
datais sorted internally bytabset_vars.If
tabset_varsoroutput_varshave "factor", "Date" and "POSIXt" columns, they are converted internally to character. This is to prevent it being displayed as numeric whencat()is executed. Sorting bytabset_varsis performed before conversion to string.
Value
NULL invisibly. This function outputs the markdown
that generates the tabset
to stdout (console).
Limitations
-
layoutis intended for simplified use cases and complex layouts may not work. When outputting tables or figures that use JavaScript (such as
{plotly},{leaflet},{DT},{reactable}, etc.), it seems JavaScript dependencies need to be resolved. A simple solution is to wrap the output inhtmltools::div()and create a dummy plot in another chunk. See the Get started for details.When
tabset_varsandoutput_varshave the following columns, they may not display well:A column of type list contains a named vector or list (This is for
output_vars.tabset_varsmust not contain list columns).Classes with their own printing methods, such as "difftime", "ts", .etc.
When specifying a list-type column that includes ggplot objects in
output_vars, setting the chunk optionecho: fencedmay cause the plots to not display correctly.
References
As this function is focused on quickly and dynamically
generating tabsets and chunks, it is difficult to customize it on a
chunk-by-chunk basis. The regular way to dynamically create chunks is
to use functions such as knitr::knit(), knitr::knit_child(),
knitr::knit_expand(), etc. For more information on these,
see the following links.
Heiss, Andrew. 2024. “Guide to Generating and Rendering Computational Markdown Content Programmatically with Quarto.” November 4, 2024. doi:10.59350/pa44j-cc302.
-
https://bookdown.org/yihui/rmarkdown-cookbook/child-document.html#child-document
-
https://bookdown.org/yihui/rmarkdown-cookbook/knit-expand.html
Examples
# sample data
df <- data.frame(
group1 = c(rep("A", 3), rep("B", 3)),
group2 = rep(c("X", "Y", "Z"), 2),
value1 = 1:6,
value2 = letters[1:6]
)
# Here are examples of the output before it is converted to tabset.
# If you want it to actually work, in the .qmd file,
# set `results='asis'` in the chunk options or
# write `#| results: asis` at the beginning of the chunk.
# Basic usage
render_tabset(df, group1, value1)
# Nested tabset, two outputs side by side with a width of 1:1
render_tabset(
df,
c(group1, group2),
c(value1, value2),
layout = "::: {layout-ncol=2}"
)
# Use heading instead of tabset
render_tabset(
df,
c(group1, group2),
value1,
heading_levels = c(2, 3)
)