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,- showTaband- 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 - fileInputcontrols. The appearance of- fileInputcontrols while files are being dragged can be modified by overriding the- shiny-file-input-activeand- shiny-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 the- recalculatingCSS 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’s- readxl::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 an- nsargument. The- nsargument can be used in a module UI function to scope the- conditionexpression 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 - updateTextInputand- updateTextAreaInputfunctions 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 - 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’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 - generateOptionsfunction. (#1702)
- Fixed #1710: - ReactiveValobjects 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)