<thead>
(using <th> cells) and body rows in
<tbody> when header rows are at the top of the
table.to_typst() and
print_typst(). Quarto integration is available as well as
quick_typst(), quick_typst_pdf(),
quick_typst_png(), and quick_typst_svg()
functions.<style> block instead of long inline styles.as_html() for obtaining table as
htmltools tags.to_screen() now displays double, dashed and dotted
border styles.slice_,
select_ etc.) These have long been deprecated in dplyr
itself.as_Workbook(). Suggestion by @oobd.?huxtable-FAQ for workarounds.by_cases() wasn’t picking up variables from the
caller environment.options(huxtable.quarto_process = TRUE).by_cases() to work with dplyr 1.1.0. Within
by_cases() formulas, . is now vector rather
than matrix when dplyr version 1.1.0 is detected. Thanks @DavisVaughan.quick_* functions. Thanks @reuning.quick_* functions. Thanks
to @ceresek.@table-label only work
with quarto labels.column_to_header() function converts a column to
header rows. New as_hux() method for
grouped_df objects optionally converts groups to header
rows.stripe_rows() and
stripe_columns().format and ... options to
fmt_percent() to allow flexible formatting via
formatC().add_footnote() gets an explicit
number_format argument which is NA by
default.to_screen().huxreg(..., error_pos = "right") to flextable.New behaviour: setting colspan() or
rowspan() overwrites the content of cells that have been
shadowed.
ht <- hux(c(1, 1), c(2, 2), c(3, 3))
ht <- set_all_borders(ht)
colspan(ht)[1, 1] <- 3
# old behaviour
ht[, c(2, 1, 3)]
## +--------------------------+
## | 2 |
## +--------+--------+--------+
## | 2 | 1 | 3 |
## +--------+--------+--------+
# new behaviour
ht[, c(2, 1, 3)]
## +--------------------------+
## | 1 |
## +--------+--------+--------+
## | 2 | 1 | 3 |
## +--------+--------+--------+New option huxtable.latex_siunitx_align allows you
to use the LaTeX siunitx package to handle decimal point
alignment. This is FALSE by default.
Bugfix: centre alignment was not working in
print_screen().
Bugfix: failure in to_md() with recent versions of
stringi package.
Bugfix: repeating a single row in a subset, like
ht[c(1, 1, 2, 3), ], was setting colspan = 2
on the repeated row.
Bugfix: zero-argument subset replacement like
ht[] <- ... wasn’t working.
align(ht) == ".". This may change the appearance of some
documents.tidy_override() to extend columns of
tidy and glance.^ was giving errors in LaTeX.table_environment property so you can use
e.g. "table*" in TeX.print_screen(h, colnames = FALSE) didn’t print
a final newline.as_flextable() now exports markdown in cells to RTF,
and to Word with the help of the optional ftExtra package.
Thanks @atusy for
adding this feature.
Improvements to markdown screen export. This now uses the
optional fansi package.
New feature: as_Workbook() gains
start_row and start_col arguments, to write a
huxtable into an Excel worksheet starting at a particular row or
column.
New feature: huxreg() gains a
glance_args argument to pass arguments to
glance().
New feature: options(huxtable.long_minus = TRUE)
will try to use long minus signs before numbers. The default is
FALSE. It will probably become TRUE in a
future version.
Bugfix: insert_row/column(..., after = 0) was
unsetting table properties.
Bugfix: unicode characters above 32767 were incorrectly represented in RTF. Thanks @kaigu1990.
Bugfix: columns were being collapsed in
as_Workbook().
Bugfix: style_cells didn’t work unless huxtable was
on the search path.
Bugfix: merge_repeated_rows merged NA
rows incorrectly.
Bugfix: number format was not set correctly in
huxreg()’s note.
Bugfix: in huxreg(), tidy_args threw an
error if the first argument to tidy() was a named
list.
Bugfix: tidy_replace() was broken.
Clearer error messages for tidy_override() when
extend = FALSE. In future, extend will
probably default to TRUE.
Huxtable 5.0.0 brings numerous changes. For a more user-friendly introduction, see https://hughjonesd.github.io/whats-new-in-huxtable-5.0.0.html.
There are changes to LaTeX output.
\tabcolsep is now set to 0 within huxtable
tables, while left and right padding should now take effect even when
wrap is FALSE.width is set. If width is set, it is
“tabularx”.wrap only matters if width is set.
Otherwise, cell wrapping is off.\centerbox macro from the LaTeX “adjustbox” package
is used to centre tables. This should improve centring when tables are
too wide. You may need to update the LaTeX “adjustbox” package to a
recent version. check_latex_dependencies() can inform you
about this.As previously signalled, add_colnames has now become
TRUE by default in huxtable() and
as_huxtable(). Set
options(huxtable.add_colnames = FALSE) to go back to the
old behaviour.
Newlines in cell contents are now respected (in LaTeX, so long as
wrap = TRUE and width has been set).
Huxtable borders have been reworked, fixing some longstanding bugs and adding new features.
Borders are now automatically collapsed. For example:
jams %>%
set_right_border(everywhere, 1, 1) %>%
set_left_border(everywhere, 2, 0.4)will set the border in between the columns of jams to
0.4, overwriting the previous value. This is more in line
with what you would expect. For example, the following code now does
what you probably want:
jams %>%
set_rowspan(2, 1, 3) %>%
set_bottom_border(4, everywhere, 1)
## Type Price
## Strawberry 1.90
## 2.10
## 1.80
## ---------------------------
instead of the old behaviour:
jams %>%
set_rowspan(2, 1, 3) %>%
set_bottom_border(4, everywhere, 1)
## Type Price
## Strawberry 1.90
## 2.10
## 1.80
## -----------set_left_border(), set_all_borders()
and friends all use a default value of 0.4. So to set a default border,
write e.g.
as_hux(head(iris)) %>%
set_bottom_border(1, everywhere)A new brdr() class encapsulates border thickness,
style and colour. You can set all properties at once by writing,
e.g.:
as_hux(jams) %>%
set_bottom_border(1, everywhere, brdr(1, "dotted", "darkgreen"))left_border(ht) and friends return a brdr
object. To access the border thickness, write
brdr_thickness(left_border(ht)).
Various deprecated items have been removed:
set_*. Instead, use
map_*.byrow argument to set_*. Instead, use
map_* and by_cols().error_style and pad_decimal arguments in
huxreg. Use error_format and
align(hx) <- ".".where(), is_a_number() and
pad_decimal() functions. Use map_* functions,
! is.na(as.numeric(x)), and
align(ht) <- ".".Default padding has been increased to 6 points.
By default, width() is now unset.
By default, wrap() is now
TRUE.
every() has been renamed to stripe(),
to avoid a clash with purrr::every().
everywhere, evens and odds are
still the same.
The little-used ability to set copy_cell_props to a
character vector in rbind.huxtable and
cbind.huxtable has been removed. You can still set it to
FALSE.
add_rows() and add_columns() now always
call rbind.huxtable() or cbind.huxtable() and
return a huxtable.
Huxtable no longer supports dplyr versions less than 0.7.0 (released mid-2017).
set_cell_properties() has been renamed
style_cells(). It is retained as a soft-deprecated
alias.
Various themes have been tweaked:
theme_basic() now has bold headers and no header column
by default.theme_plain() defaults to
position = "centre".theme_striped() uses grey stripes, a white border, and
subtler headers.theme_article() has thinner borders.You can now use markdown within table cells.
set_markdown(ht, rows, cols) to turn this on.set_markdown_contents()
to set cell contents that will be interpreted as markdown.Huxtable now has the concept of header row and columns.
set_header_rows(ht, row_numbers, TRUE). For columns, use
header_cols() or set_header_cols().style_headers(),
style_header_cols(), and style_header_rows()
to set multiple properties on headers.header_row/col = TRUE set the first row/col
to a header, and style all header rows/cols.set_bold() and set_italic() now use a
default value of TRUE. So you can write e.g.
as_hux(head(iris)) %>%
set_bold(1, everywhere)Console output in R now shows table position and caption position.
By default, huxtable now sets labels from the current knitr chunk
label, if there is one. This is consistent with kable(). In
bookdown, you can then do e.g.
Some iris species are shown in \@ref(tab:mytable):
```r
as_hux(iris)
```
Set options(huxtable.autolabel = FALSE) to turn off this
behaviour.
The one-argument form of [ now works for huxtables
just as it does for data frames. For example, ht[2:3]
selects columns 2 and 3.
New functions fmt_percent() and
fmt_pretty() for passing into
number_format():
jams$Sugar <-c ("Sugar content", 0.4, 0.35, 0.45)
set_number_format(jams, -1, "Sugar", fmt_percent(1))split_across() and split_down() split a
huxtable into a list of sub-tables. Headers can be automatically
included.
restack_across() and restack_down()
split a huxtable, then join it back up. This is useful for making a
table fit on a page.
merge_across() and merge_down() merge
an area of cells horizontally across rows, or vertically down
columns.
New functions
set_lr_borders()/_border_colors()/_border_styles()/_padding()
set left and right borders and padding simultaneously. New functions
set_tb_borders() etc. set top and bottom properties
simultaneously. There are map_ equivalents of all of
these.
set_outer_padding() sets padding around a range of
cells, similarly to set_outer_borders().
A new table-level property, caption_width(), allows
you to set the width of the caption. The default, NA, sets
the width equal to the table width.
There are two new themes: theme_compact() and
theme_bright().
For huxreg(), a new function
tidy_replace() allows you to replace the output of
tidy(x) entirely.
huxtable now only sets
options(huxtable.knit_print_df = TRUE) if it is attached,
not if it is loaded.
huxtable supports dplyr::relocate(), new in dplyr
1.0.0.
Improvements to as_flextable().
Improvements to quick_pptx() (thanks @davidgohel).
Bugfixes for
options(huxtable.use_fontspec = TRUE).
Bugfix: add_rownames = "string" now works as
promised.
Bugfix: non-ASCII characters are now supported in RTF.
New versions of the gtsummary
package will have an as_huxtable() method.
Package texreg on CRAN
includes a huxtablereg() function for creating a table of
regression outputs.
by_quantiles(), by_equal_groups() and
by_colorspace() have gained a colwise
argument, which calculates quantiles or colors separately for each
column.as_flextable() (thanks @sjewo).merge_repeated_rows() function: merge repeated rows
into a single cell.fill and colspan/rowspan arguments for
insert_row()/insert_column():
insert_row(ht, "blah", "", "", "", "", ...) can be
written insert_row(ht, "blah", fill = "").colspan/rowspan set colspan/rowspan of the
first cell in the inserted row/column.to_screen().options('huxtable.latex_use_fontspec') to
TRUE to use portable font names in TeX documents, with the
LaTeX “fontspec” package.hux_logo().row_height correctly.quick_latex() function.texreg package now includes a
huxtablereg function, analogous to huxreg,
which outputs a huxtable from a list of regressions. This will be
available from the next version of texreg.flextable package
and recent versions of Pandoc. (Powerpoint printing requires Pandoc
>= 2.4.0.)position()
allow text wrapping around tables.set_outer_border_colors() and
set_outer_border_styles() functions, like
set_outer_borders().broom package, instead
using the generics package. If you use
huxreg(), you will still need e.g. broom or
broom.mixed to provide tidy() and
glance() methods for specific models.tidy.tidy_override() and
glance.tidy_override() should work even if underlying
object has no tidy() or glance() method.echo = TRUE in
Rmd pdf_document format.caption() and height() weren’t
playing nicely.mutate(..., copy_cell_props = FALSE) was adding
a column named copy_cell_props.check_latex_dependencies and
install_latex_dependencies gave misleading errors.stars is NULL in
huxreg, don’t print a note by default.tinytex when available, allowing
autoinstallation of latex packages.map_xxx functions to set properties variably by
cell values.by_rows,
by_values, by_ranges,
by_quantiles etc.tidy_override function to override p values etc. in
huxreg.set_contents function to change huxtable contents
within dplyr pipes.install_latex_dependencies() or
tlmgr if it is not already on your system.huxtable() and friends,
add_rownames = "Colname" now sets the name for the new
column.set_xxx functions is deprecated,
as is the where function. Use map_xxx
instead.byrow is soft-deprecated. Use
by_cols() instead.wrap=TRUE caused squeezed text in RTF.TeX code was getting escaped by pandoc. To avoid this, if possible, huxtable now adds fenced code blocks round latex tables (see https://pandoc.org/MANUAL.html#extension-raw_attribute). You must add
md_extensions: +raw_attribute
to your YAML header for this to work, and you will need a recent (> 2.0.0) version of Pandoc.
print_rtf, to_rtf and
quick_rtf functions.border_style properties to set “solid”, “double”,
“dotted” or “dashed” borders. (At present, LaTeX only allows “solid” or
“double”.)merge_cells function, an alternative interface to
colspan and rowspan.quick_pptx function to print data frames and
huxtables into Powerpoint.install_latex_dependencies and
check_latex_dependencies utility functions.add_rows and add_columns now accept data
frames as arguments.theme_mondrian theme :-Dprint_md now handles bold
and italic cells.quick_pdf has new width and
height options to change paper size.print_screen and print_md would
hang with a wide huxtable.tribble_hux function wrapping
tibble::tribble() for readable data input.add_rows and add_columns functions to
insert one or more rows into the middle of a huxtable.is_a_number is deprecated.hux_logo() ;-)format method which returns the result of
to_html, to_latex etc. as appropriate.to_html printing e.g. “left-border: NA;” in
cell CSS.set_all_* not working when huxtable is not
attached.as_Workbook failing with non-numeric
width.hux_logo was using multiple fonts, fails with
Excel output.as_flextable borders not working in cells with
colspan > 1.theme_plain theme.add_colnames is going to become
TRUE. At present it remains FALSE. Set
options("huxtable.add_colnames") to TRUE or
FALSE to set the default and avoid warnings in future.quick_* functions now automatically open documents if
used interactively. Use open = FALSE to avoid.pad_decimal is deprecated in favour of
align(ht) <- ".".huxreg continues with a warning if
statistics are unavailable for some models.knit_print.data.frame methods.
This means that bare data frames will be pretty-printed via huxtable if
the package is loaded.
options("huxtable.knit_print_df") to
FALSE if you don’t want this.theme_plain theme. Set
options(“huxtable.knit_print_df_theme”) to a different one-argument
function if you want to use a different theme.autoformat argument lets
huxtable() and as_huxtable() automatically
choose alignment and number format based on column type. Set
options("huxtable.autoformat") to FALSE to
turn off this feature by default.number_format has changed from
“%5.3g” to “%.3g”, which no longer space-pads numbers.as_flextable now does not print column names in the
header. This matches the standard huxtable behaviour whereby headers are
“just another row/column”. To get the old behaviour, use
colnames_to_header = TRUE.add_colnames.huxreg was never using built-in confidence
intervals.number_format,
huxreg, as_hux.table,
as_flextable.openxlsx
package.quick_xlsx function.set_* column
specifications: e.g. set_bold(ht, 1:3, matches(“ab”), TRUE)after argument to
insert_column.quick_* functions: when the file argument
is not explicitly specified, confirm overwrites manually, or fail if
called non-interactively.tidy_args argument to huxreg allows per-model
customization of the call to tidy.quick_xxx functions without an explicit
file argument throw an error if called non-interactively,
and prompt before overwriting files if called interactively.number_format to exponents in scientific
notation.quick_pdf error when moving output across
filesystems.quick_html, quick_pdf and
quick_docx functions to print table-like objects to a new
document.to_screen only shows colnames if there are any
non-zero-length column names.number_format now applies to any number-like substrings
in cells. This means you can include e.g. significance stars in a cell
and still use number_format to format the content.number_format is NA, numbers are unchanged.number_format has changed from “%5.2f”
to “%5.3g”, which plays nicer with integers but may surprise you by
using scientific format for large numbers.outer_borders argument for huxreg.
This changes default behaviour slightly.border argument for add_footnote to
choose width of footnote’s top border.set_outer_borders now accepts the same row/column
arguments as other set_ functions.align, position and
caption_pos.huxreg.set_outer_borders function to set borders round a
rectangle of cells.to_screen and to_md now respect
wrap and col_widths properties.to_screen and to_md gain a
min_width argument; to_md gains a logical
header argument; to_screen gains a
compact argument replacing blank = NULL.crayon
package is installed. New huxtable.color_screen
option.ReporteRs to officer and
flextable. No more RJava horror.error_format argument to huxreg for
flexible control over uncertainty estimates.collapse, borders,
blank and colname_color from
to_screen/print_screen.as_FlexTable is deprecated and calls
as_flextable with a warning. header_rows and
footer_rows arguments are ignored. If you need this
feature, tell me.huxreg:
ci_level is NULL by default. Set it to a
number to calculate confidence intervals.error_style is deprecated with a warning in favour of
error_format.{stars} not %stars% to display
significance levels in the note argument.borders becomes a number specifying border width. Set
to 0 for no borders.insert_row and
insert_column.latex_float property allows you to change positioning
in LaTeX.caption_pos.set_default_properties function to set default
properties for new huxtables.huxreg.huxreg function to convert a list of models to a
huxtable.subset, and filling in values by row.$<-, [<- and
[[<- now work better.set_cell_properties to set multiple
properties on cells.evens, odds, everywhere,
every(n, from), final(n),
where(cond): convenience functions to select rows, columns
and cells.ReporteRs.filter and
select.guess_knitr_output_format.huxreg.theme_minimal has been renamed theme_basic
to avoid a name clash with ggplot2.NEWS.md file to track changes to the
package.