render.table
render.table(self, _fn=None, *, index=False, classes='table shiny-table w-auto', border=0, **kwargs)
Reactively render a pandas DataFrame
object (or similar) as a basic HTML table.
Consider using data_frame instead of this renderer, as it provides high performance virtual scrolling, built-in filtering and sorting, and a better default appearance. This renderer may still be helpful if you use pandas styling features that are not currently supported by data_frame.
Parameters
index: bool = False
-
Whether to print index (row) labels. (Ignored for pandas
Styler
objects; callstyle.hide(axis="index")
from user code instead.) classes: str = ‘table shiny-table w-auto’
-
CSS classes (space separated) to apply to the resulting table. By default, we use
table shiny-table w-auto
which is designed to look reasonable with Bootstrap 5. (Ignored for pandasStyler
objects; callstyle.set_table_attributes('class="dataframe table shiny-table w-auto"')
from user code instead.) **kwargs:
object
= {}-
Additional keyword arguments passed to
pandas.DataFrame.to_html()
orpandas.io.formats.style.Styler.to_html()
.
Returns
Type | Description |
---|---|
A decorator for a function that returns any of the following: 1. A pandas DataFrame object. 2. A pandas Styler object. 3. Any object that has a .to_pandas() method (e.g., a Polars data frame or Arrow table). |
Tip
The name of the decorated function (or @output(id=...)
) should match the id
of a output_table container (see output_table for example usage).
See Also
- output_table for the corresponding UI component to this render function.
Examples
#| standalone: true
#| components: [editor, viewer]
#| layout: vertical
#| viewerHeight: 400
## file: app.py
import pathlib
import pandas as pd
from shiny import App, Inputs, Outputs, Session, render, ui
dir = pathlib.Path(__file__).parent
mtcars = pd.read_csv(dir / "mtcars.csv")
app_ui = ui.page_fluid(
ui.input_checkbox("highlight", "Highlight min/max values"),
ui.output_table("result"),
# Legend
ui.panel_conditional(
"input.highlight",
ui.panel_absolute(
"Yellow is maximum, grey is minimum",
bottom="6px",
right="6px",
class_="p-1 bg-light border",
),
),
class_="p-3",
)
def server(input: Inputs, output: Outputs, session: Session):
@render.table
def result():
if not input.highlight():
# If we're not highlighting values, we can simply
# return the pandas data frame as-is; @render.table
# will call .to_html() on it.
return mtcars
else:
# We need to use the pandas Styler API. The default
# formatting options for Styler are not the same as
# DataFrame.to_html(), so we set a few options to
# make them match.
return (
mtcars.style.set_table_attributes(
'class="dataframe shiny-table table w-auto"'
)
.hide(axis="index")
.format(
{
"mpg": "{0:0.1f}",
"disp": "{0:0.1f}",
"drat": "{0:0.2f}",
"wt": "{0:0.3f}",
"qsec": "{0:0.2f}",
}
)
.set_table_styles(
[dict(selector="th", props=[("text-align", "right")])]
)
.highlight_min(color="silver")
.highlight_max(color="yellow")
)
app = App(app_ui, server)
## file: mtcars.csv
mpg,cyl,disp,hp,drat,wt,qsec,vs,am,gear,carb
21,6,160,110,3.9,2.62,16.46,0,1,4,4
21,6,160,110,3.9,2.875,17.02,0,1,4,4
22.8,4,108,93,3.85,2.32,18.61,1,1,4,1
21.4,6,258,110,3.08,3.215,19.44,1,0,3,1
18.7,8,360,175,3.15,3.44,17.02,0,0,3,2
18.1,6,225,105,2.76,3.46,20.22,1,0,3,1
14.3,8,360,245,3.21,3.57,15.84,0,0,3,4
24.4,4,146.7,62,3.69,3.19,20,1,0,4,2
22.8,4,140.8,95,3.92,3.15,22.9,1,0,4,2
19.2,6,167.6,123,3.92,3.44,18.3,1,0,4,4
17.8,6,167.6,123,3.92,3.44,18.9,1,0,4,4
16.4,8,275.8,180,3.07,4.07,17.4,0,0,3,3
17.3,8,275.8,180,3.07,3.73,17.6,0,0,3,3
15.2,8,275.8,180,3.07,3.78,18,0,0,3,3
10.4,8,472,205,2.93,5.25,17.98,0,0,3,4
10.4,8,460,215,3,5.424,17.82,0,0,3,4
14.7,8,440,230,3.23,5.345,17.42,0,0,3,4
32.4,4,78.7,66,4.08,2.2,19.47,1,1,4,1
30.4,4,75.7,52,4.93,1.615,18.52,1,1,4,2
33.9,4,71.1,65,4.22,1.835,19.9,1,1,4,1
21.5,4,120.1,97,3.7,2.465,20.01,1,0,3,1
15.5,8,318,150,2.76,3.52,16.87,0,0,3,2
15.2,8,304,150,3.15,3.435,17.3,0,0,3,2
13.3,8,350,245,3.73,3.84,15.41,0,0,3,4
19.2,8,400,175,3.08,3.845,17.05,0,0,3,2
27.3,4,79,66,4.08,1.935,18.9,1,1,4,1
26,4,120.3,91,4.43,2.14,16.7,0,1,5,2
30.4,4,95.1,113,3.77,1.513,16.9,1,1,5,2
15.8,8,351,264,4.22,3.17,14.5,0,1,5,4
19.7,6,145,175,3.62,2.77,15.5,0,1,5,6
15,8,301,335,3.54,3.57,14.6,0,1,5,8
21.4,4,121,109,4.11,2.78,18.6,1,1,4,2