Changelog
Source:NEWS.md
reactable 0.4.4.9000 (Unreleased)
New features
-
Experimental support for server-side data processing in Shiny apps. Use
reactable(server = TRUE)to render a table using server-side data processing in Shiny. Server-side data processing requires the V8 package, which is not installed with reactable by default. (#22)library(shiny) library(reactable) tbl <- reactable( mtcars, server = TRUE ) ui <- fluidPage( reactableOutput("tbl") ) server <- function(input, output) { output$tbl <- renderReactable({ tbl }) } shinyApp(ui, server) New
Reactable.gotoPage()andReactable.setPageSize()methods in the JavaScript API to change the current page or set the current page size. (#322)-
JSON serialization of data can now be customized using the
reactable.json.funcoption. This is an experimental feature for advanced use only, and intentionally undocumented outside of NEWS. reactable may change how data is serialized between versions and does not guarantee stability. Seereactable:::toJSONas a reference for how data is currently serialized. (@khusmann, #415)Example usage:
# Use yyjsonr as a faster alternative for JSON serialization. Note that this is not 1:1 consistent with # jsonlite, and several edge cases are not handled here, including data frames with 1 row, datetimes, and NULLs. options(reactable.json.func = function(x, ...) { result <- yyjsonr::write_json_str( x, opts = yyjsonr::opts_write_json( dataframe = "columns", auto_unbox = TRUE, num_specials = "string" ) ) class(result) <- "json" result })
Minor improvements and bug fixes
- Fixed
JS()not working whenhtmlwidgets1.6.3 or later is installed. (#348) - In
reactableTheme(),stripedColorandhighlightColornow work when using sticky columns. (@grcatlin, #401) - In Crosstalk tables, pagination no longer resets when selecting a row on a page greater than 1. (@msaltieri, #349)
- In Shiny apps, tables now update correctly when reactive
metavalues change. (@khusmann, #416)
Breaking changes
- Internet Explorer 11 (IE 11) is no longer supported.
-
core-jsis no longer included in the HTML dependencies. This was required to support IE 11 and old versions of the RStudio Viewer. (#245) -
metais now converted to JavaScript in the same way asdata, using reactable’s internal JSON serialization function rather than htmlwidgets’s JSON serialization function. This should only be a breaking change in rare cases, as the major difference is that numericNA,NaN,Inf, and-Infvalues are now serialized as strings and preserved, rather than always being converted tonull. (@khusmann, #415)
reactable 0.4.3
CRAN release: 2023-01-07
Documentation - reactable 0.4.3
- Fixed a failing CRAN check on the
r-devel-linux-x86_64-fedora-clangplatform. (#308)
reactable 0.4.1
CRAN release: 2022-12-08
Documentation - reactable 0.4.1
- Fixed a failing test on Fedora 36 and earlier.
reactable 0.4.0
CRAN release: 2022-12-04
Documentation - reactable 0.4.0
New features
-
Experimental support for rendering tables to static HTML in R. Use
reactable(static = TRUE)to render a table to static HTML, oroptions(reactable.status = TRUE)to enable static rendering globally. With static rendering, tables are pre-rendered to their initial HTML so they appear immediately without any flash of content. Tables are then made interactive and subsequently rendered by JavaScript as needed. Static rendering requires the V8 package, which is not installed with reactable by default. Learn more in the Static Rendering article. -
reactable()gains ametaargument to pass arbitrary data from R to JavaScript render functions and style functions. Custom metadata can be accessed using thestate.metaproperty, and updated usingupdateReactable()in Shiny orReactable.setMeta()in the JavaScript API. See examples of using custom metadata for custom rendering or custom metadata for conditional styling. (#255) - New
Reactable.onStateChange()method in the JavaScript API that sets up a function to be called whenever the table state changes. (#265) - New
Reactable.setData()method in the JavaScript API for updating the table data. (#278) -
Reactable.downloadDataCSV()in the JavaScript API now supports an additionaloptionsargument to change the field or decimal separator, include specific columns, and exclude column headers. (#239, #293) - New
Reactable.getDataCSV()method in the JavaScript API to get the table data as a CSV string. - New
Reactable.toggleHideColumn()andReactable.setHiddenColumns()methods in the JavaScript API to toggle or set hidden columns. JavaScript render functions and style functions also receive a newstate.hiddenColumnsproperty for the hidden columns in the table. (#246) -
getReactableState()now includes the current sorted columns. (#265)
Minor improvements and bug fixes
- Updated the documentation site for Internet Explorer 11 (IE 11) deprecation, Bootstrap 5 theming, and better accessibility. Examples now use modern JavaScript features that aren’t supported in IE 11, like template literals and arrow functions. Examples now also use scalable font sizes and length units where appropriate (i.e.,
rem/eminstead ofpx). The documentation site uses the default root font size of16px, so examples may look different on pages that change the root font size. For example, Bootstrap 3 sets a default root font size of10px, so you may need to adjust theremvalues before adapting examples to your site. (Bootstrap 4 and above no longer change the default root font size). - R style functions no longer apply to aggregated cells and rows incorrectly. (@fawda123, #250)
- JavaScript render functions and style functions no longer receive an invalid
cellInfo.indexorrowInfo.indexproperty for aggregated cells and rows. (#250) - Column group header widths are now calculated correctly with hidden columns in the column group. (@Patrikios, #253)
-
NULLvalues in list-columns now correctly appear as missing values instead of[object Object].NULLvalues are now represented asnullvalues in JavaScript instead of an empty object like {}. -
reactableTheme()styles no longer override custom user CSS in the HTML document<head>. -
getReactableState()now accepts multiple values in itsnameargument to return a subset of state values. -
reactable()now respectshtmlwidget::sizingPolicy()’sviewer.fillandbrowser.filland fills the RStudio Viewer pane by default. (@cpsievert, #280) - Using
reactable()on a dplyr grouped data frame (dplyr::group_by()orgrouped_df) withrownames = TRUEno longer adds astringsAsFactorscolumn to the table. (@daattali, #283)
Breaking changes
-
Numeric
NAvalues are now represented asnullin JavaScript instead of an"NA"string. NumericNaN,Inf, and-Infvalues are now represented asNaN,Infinity, and-Infinityin JavaScript instead of"NaN","Inf", and"-Inf"strings. (@daattali, #261) Support for Internet Explorer 11 (IE 11) is deprecated. Existing features will continue to work in IE 11, but new features may not support IE 11, and IE 11 is no longer tested.
The documentation website no longer supports IE 11.
reactable 0.3.0
CRAN release: 2022-05-26
Documentation - reactable 0.3.0
This release upgrades to a new major version of React Table (#35), which brings many new features, improvements, and bug fixes. reactable has been largely rewritten to take advantage of React Table’s new approach as a flexible table utility rather than a table component.
This means it’ll be easier to add new custom features, customize styling and markup, and maintain reactable in the future. Most of the features and fixes in this release would not have been possible or easy to do without this upgrade.
Backward compatibility was kept where possible, but note that there are several breaking changes, particularly around the JavaScript API.
New features
- Cell content can now be vertically aligned using the new
vAlignandheaderVAlignarguments incolDef(), and the newheaderVAlignargument incolGroup()(#142, #177). - Sticky columns are now supported using a new
stickyargument incolDef()andcolGroup()(#19, #72, #141). - New JavaScript API to manipulate or access tables from JavaScript. Use this to create custom interactive controls, such as CSV download buttons, custom filter inputs, or toggle buttons for row grouping and row expansion (#11, #28, #182, #194). Learn more in the JavaScript API guide or the JavaScript API examples.
- Column filtering and table searching can now be customized. Learn more in the Custom Filtering guide.
-
reactable()gains asearchMethodargument to use a custom JavaScript function for global table searching (#222). -
colDef()gains afilterMethodargument to use a custom JavaScript function for column filtering (#9, #90, #145). -
colDef()gains afilterInputargument to render a custom filter input for column filtering (#9).
-
-
reactable()gains apaginateSubRowsargument to include grouped sub rows in pagination. This is recommended for grouped tables with a large number of rows where expanded rows may not all fit on one page. - Expanded rows now stay expanded on sorting, filtering, and pagination changes. Previously, expanded rows were always collapsed on sorting and pagination changes, and incorrectly persisted on filtering changes (#39).
- Aggregated rows can now be selected when multiple selection is enabled.
-
colDef()gains agroupedargument to customize rendering for grouped cells ingroupBycolumns (#33, #94, #148). - Column group headers can now be resized.
- Column group headers and filters are now sticky. Previously, only column headers were sticky (#107).
- JavaScript render functions and style functions receive new properties:
-
rowInfo.expandedandcellInfo.expandedindicating whether the row is expanded -
cellInfo.selectedindicating whether the cell’s row is selected -
state.page,state.pageSize, andstate.pagesfor the current page index, page size, and number of pages in the table -
cellInfo.filterValueandcolumn.filterValuefor the column filter value, andcolumn.setFilterto set the filter value -
state.filtersfor the column filter values -
state.searchValuefor the table search value -
state.selectedfor the selected row indices
-
- JavaScript render functions for cells, headers, footers, and row details receive a new
stateargument to access the table state (#88). Custom cell click actions also now receive astateargument. - R render functions for row details now receive an additional argument for the column name (@ksnap28, #155).
-
colDef()gains asearchableargument to enable or disable global table searching. Columns can be excluded from searching usingcolDef(searchable = FALSE), and hidden columns can be included in searching usingcolDef(searchable = TRUE)(#217).
Breaking changes
JavaScript render and style functions
Several properties and arguments have been renamed or moved for consistency with the rest of the API. These properties were not removed unless they were very rarely used, so most code should continue to work upon upgrading.
-
The
rowInfo.rowproperty is now deprecated, and has been renamed torowInfo.values.rowInfo.rowremains supported, but replace usages withrowInfo.valueswhen possible. -
The
colInfo.columnandcolInfo.dataproperties in header and cell render functions are now deprecated. ThecolInfoobject now contains all of the same properties ascolInfo.column, and is now referred to ascolumnin the documentation. When possible, replace usages ofcolInfowithcolumn,colInfo.columnwithcolumn, andcolInfo.datawithstate.sortedData(current rows after sorting and filtering) orstate.data(the original data). -
The
state.expandedproperty has been removed. To check whether a row is expanded, userowInfo.expandedinstead. -
The
rowInfo.pageandcellInfo.pageproperties have been removed. To get the current page index of the table, usestate.pageinstead. -
When accessing row data in JavaScript render functions and style functions:
-
Date and time values are now represented in UTC time (ISO 8601 format), rather than local time without a timezone.
Single values (length-1 vectors) in list-columns are no longer represented as arrays (i.e., data is now serialized using
jsonlite::toJSON(auto_unbox = TRUE)). For example,list(x = 1)in R is now represented as{x: 1}in JavaScript instead of{x: [1]}.
-
Other changes
- When both
columnGroupsandgroupByarguments are provided inreactable(),groupBycolumns are no longer added to a column group automatically (#87). - The
defaultGroupHeaderargument inreactableLang()is now deprecated and no longer used. Use thecolumnGroupsargument inreactable()to customize the column group header forgroupBycolumns. - The
detailsCollapseLabel,deselectAllRowsLabel,deselectAllSubRowsLabel, anddeselectRowLabelarguments inreactableLang()are now deprecated and no longer used (#167). - The row selection column is now always placed as the first column in the table, even before the
groupByand row details columns (#71). - Increased the default width of the row selection column to match the row details column (45px).
- The default cell padding can no longer be overridden using custom CSS or inline styles on cells. To customize the cell padding, use a theme instead, like
reactableTheme(cellPadding = "...")(#248, #142, #177).
Minor improvements and bug fixes
- Setting
show = FALSEas a default value indefaultColDef()now works (@csgillespie, #105). SettingsortNALast,html, andnato their default values indefaultColDef()also now works. - Using a single value for
pageSizeOptionsinreactable()now works. - Column resizing is now limited by the min and max width of the column.
- Column group headers and filter cells in fixed height tables now display properly in Safari, Chrome, and the RStudio Viewer (#76).
- In
reactable(),defaultExpanded = TRUEnow expands all rows in the table, not just rows on the first page. - In
reactable(),defaultExpanded = TRUEnow works when column groups are present. - Aggregated cell values are now recalculated when filtering or searching the table.
- Aggregate functions now always take the unaggregated values in the column. Previously, if there were multiple
groupBycolumns, aggregate functions could take aggregated values which could produce inaccurate calculations (e.g., when calculating the mean of values). - The
"max"and"min"aggregate functions now work on dates, date-times, and strings (#130). - Column formatters no longer apply to empty aggregated cell values.
- Searching now properly ignores the row details and selection columns.
- Selected rows now reset when the table data changes in Shiny (#110).
- When selecting rows, errors from other Crosstalk widgets no longer cause the table to disappear.
- HTML widgets and HTML dependencies in nested tables now render correctly (#125).
- Tables are now displayed with full width when rendered inside an R Markdown document or R Notebook (#163).
-
reactable()now works for data frames withdifftimeobjects and objects with custom classes (#164). -
colFormat()now formats dates and times in the user’s time zone, rather than ignoring time zones. - Row expand buttons no longer change their accessible labels based on expanded state. They now use the
aria-expandedattribute to indicate expanded or collapsed state, and use “Toggle details” as their default label (#167). -
reactableLang()gains thegroupExpandLabelargument to customize the accessible label for row group expand buttons (#167). - Row selection checkboxes and radio buttons no longer change their accessible labels based on selection state (#167).
- Cells can now be marked up as row headers for assistive technologies, using the new
rowHeaderargument incolDef(). Cells in the row names column are automatically marked up as row headers (#167). - The page info and “no rows found” message are now marked as ARIA live regions so page changes can be announced by assistive technologies when searching, filtering, or paging through the table (#167).
- Scrollable tables are now focusable and scrollable when using a keyboard (#167).
- In
reactableTheme(),filterInputStylenow applies correctly when rerendering a table in Shiny (#186). - In
reactableTheme(),cellPaddingnow applies to column group headers correctly. - Columns with square brackets (
[or]) in their column name now render correctly (#187). - Disabling pagination using
reactable(pagination = FALSE)now works correctly on table data updates (#214). - More HTML attributes are supported when rendering HTML tags, such as
onclick(#150). - Improved initial load time of tables with a large number of rows (up to 50% faster in some cases).
reactable 0.2.2
CRAN release: 2020-09-13
Bug fixes
- Headers in fixed height tables now display properly in Safari, Chrome, and the RStudio Viewer (#76).
reactable 0.2.1
CRAN release: 2020-09-01
New features
-
updateReactable()gains adataargument to update the data of a reactable instance in Shiny (#49).
Bug fixes
- Row selection columns now display correctly in tables with column groups (#52).
-
defaultSelectednow works correctly with Crosstalk linked selection. - Crosstalk selection and filtering now works with nested and dynamically rendered tables #57).
- Tables now display correctly for Crosstalk
SharedDataobjects with zero or one rows. - Shiny UI elements in expanded row details are now properly removed when collapsed on page changes.
-
colFormat()now always formats numbers as a localized string whenlocalesis specified. - Table rows no longer stretch to fill the height of the container (#69). To make rows stretch again, use a theme like
reactableTheme(tableBodyStyle = list(flex = "auto")). - Multi-sorting no longer selects text in column headers.
reactable 0.2.0
CRAN release: 2020-05-28
New features
-
reactable()now supports linked selection and filtering with Crosstalk-compatible HTML widgets (#46). -
reactable()gains athemeargument to customize the default styling of a table. -
reactable()gains alanguageargument to customize the language strings in a table (#24). -
reactable()gains adefaultSelectedargument to set default selected rows. -
reactable()gains adefaultExpandedargument to set default expanded rows (#23). - New
updateReactable()function to update the selected rows, expanded rows, or current page of a reactable instance in Shiny (#20). - New
getReactableState()function to get the state of a reactable instance in Shiny (#20). -
colDef()gains a"median"aggregate function to calculate the median of numbers (#30). - The row selection column can now be customized using
".selection"as the column name (#19). - In
reactable(), therowClass,rowStyle, anddetailsJavaScript functions now receive arowInfo.selectedproperty indicating whether the row is selected (#20).
Breaking changes
- The
selectionIdargument inreactable()will be deprecated in a future release. UsegetReactableState()to get the selected rows of a table in Shiny instead.
Bug fixes
- General accessibility improvements, particularly for screen reader users.
- Table searching now works correctly when row selection is enabled.
-
colFormat(date = TRUE)now formatsYYYY-MM-DDdates correctly (#38). -
colFormat(percent = TRUE)now works correctly when viewing tables in IE11. - Cell click actions now work for all cells in aggregated rows.
- Aggregated cells in columns with row details no longer throw an error when clicked.
- In
colDef(), theclassandstyleR functions now handle list-columns correctly. - Column headers now truncate long text properly.
- Footers now display properly in fixed height tables for Safari and Chrome (#41).
- Dark themes no longer affect text color in RStudio R Notebooks (#21).
- Checkboxes and radio buttons now align with multi-line text in selectable tables.
- Text selection now works in column headers.
- Row striping and highlighting styles no longer affect nested tables.