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: asis
at the beginning of the chunk orresults='asis'
in the chunk options.If multiple
tabset_vars
are given, create nested tabsets.For columns specified in
output_vars
, columns of type list are output withprint()
and normal columns are output withcat()
.The
data
is sorted internally bytabset_vars
.If
tabset_vars
oroutput_vars
have "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_vars
is performed before conversion to string.
Value
NULL
invisibly. This function outputs the markdown
that generates the tabset
to stdout (console).
Limitations
-
layout
is 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_vars
andoutput_vars
have 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_vars
must 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: fenced
may 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)
)