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, showTab and hideTab) that allow you to do those actions for an existing tabsetPanel. (#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. (#1770

  • Implemented #1155: Files can now be drag-and-dropped on fileInput controls. The appearance of fileInput controls while files are being dragged can be modified by overriding the shiny-file-input-active and shiny-file-input-over classes. (#1782)

Minor new features and improvements

  • Addressed #1688: trigger a new shiny:outputinvalidated event when an output gets invalidated, at the same time that the recalculating CSS class is added. (#1758, thanks @andrewsali!)

  • Addressed #1508: fileInput now permits the same file to be uploaded multiple times. (#1719)

  • Addressed #1501: The fileInput control now retains uploaded file extensions on the server. This fixes readxl’s readxl::read_excel and 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 conditionalPanel function now accepts an ns argument. The ns argument can be used in a module UI function to scope the condition expression 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 updateTextInput and updateTextAreaInput functions 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() and snapshotPreprocessOutput() 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 isRunning to 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’s session$userData). To be clear, it allows something like session$userData$x <- TRUE, but not something like session$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 generateOptions function. (#1702)

  • Fixed #1710: ReactiveVal objects did not have separate dependents. (#1712)

  • Fixed #1438: unbindAll() should not be called when inserting content with insertUI(). 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 the shinyApp(onStart = function()) argument. (#1770)