Upgrade notes for Shiny 1.0.4
There are three headlining features in this release of Shiny. It is now possible to add and remove tabs from a tabPanel; there is a new function, onStop(), which registers callbacks that execute when an application exits; and fileInputs now can have files dragged and dropped on them. In addition to these features, this release has a number of minor features and bug fixes. See the full changelog below for more details.
Full changelog
New features
Implemented #1668: dynamic tabs: added functions (
insertTab,appendTab,prependTab,removeTab,showTabandhideTab) that allow you to do those actions for an existingtabsetPanel. (#1794)Implemented #1213: Added a new function,
onStop(), which can be used to register callback functions that are invoked when an application exits, or when a user session ends. (Multiple sessions can be connected to a single running Shiny application.) This is useful if you have finalization/clean-up code that should be run after the application exits. (#1770Implemented #1155: Files can now be drag-and-dropped on
fileInputcontrols. The appearance offileInputcontrols while files are being dragged can be modified by overriding theshiny-file-input-activeandshiny-file-input-overclasses. (#1782)
Minor new features and improvements
Addressed #1688: trigger a new
shiny:outputinvalidatedevent when an output gets invalidated, at the same time that therecalculatingCSS class is added. (#1758, thanks @andrewsali!)Addressed #1508:
fileInputnow permits the same file to be uploaded multiple times. (#1719)Addressed #1501: The
fileInputcontrol now retains uploaded file extensions on the server. This fixes readxl’sreadxl::read_exceland other functions that must recognize a file’s extension in order to work. (#1706)For
conditionalPanels, Shiny now gives more informative messages if there are errors evaluating or parsing the JavaScript conditional expression. (#1727)Addressed #1586: The
conditionalPanelfunction now accepts annsargument. Thensargument can be used in a module UI function to scope theconditionexpression to the module’s own input and output IDs. (#1735)With
options(shiny.testmode=TRUE), the Shiny process will send a message to the client in response to a changed input, even if no outputs have changed. This helps to streamline testing using the shinytest package. (#1747)Addressed #1738: The
updateTextInputandupdateTextAreaInputfunctions can now update the placeholder. (#1742)Converted examples to single file apps, and made updates and enhancements to comments in the example app scripts. (#1685)
Added new
snapshotPreprocessInput()andsnapshotPreprocessOutput()functions, which is used for preprocessing and input and output values before taking a test snapshot. (#1760, #1789)The HTML generated by
renderTable()no longer includes comments with the R version, xtable version, and timestamp. (#1771)Added a function
isRunningto test whether a Shiny app is currently running. (#1785)Added a function
setSerializer, which allows authors to specify a function for serializing the value of a custom input. (#1791)
Bug fixes
Fixed #1546: make it possible (without any hacks) to write arbitrary data into a module’s
session$userData(which is exactly the same environment as the parent’ssession$userData). To be clear, it allows something likesession$userData$x <- TRUE, but not something likesession$userData <- TRUE(that is not allowed in any context, whether you’re in the main app, or in a module) (#1732).Fixed #1701: There was a partial argument match in the
generateOptionsfunction. (#1702)Fixed #1710:
ReactiveValobjects did not have separate dependents. (#1712)Fixed #1438:
unbindAll()should not be called when inserting content withinsertUI(). A previous fix (#1449) did not work correctly. (#1736)Fixed #1755: dynamic htmlwidgets sent the path of the package on the server to the client. (#1756)
Fixed #1763: Shiny’s private random stream leaked out into the main random stream. (#1768)
Fixed #1680:
options(warn=2)was not respected when running an app. (#1790)Fixed #1772: ensure that
runApp()respects theshinyApp(onStart = function())argument. (#1770)