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 fileInput
s 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
andhideTab
) 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
fileInput
controls. The appearance offileInput
controls while files are being dragged can be modified by overriding theshiny-file-input-active
andshiny-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 therecalculating
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’sreadxl::read_excel
and other functions that must recognize a file’s extension in order to work. (#1706)For
conditionalPanel
s, 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 anns
argument. Thens
argument can be used in a module UI function to scope thecondition
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
andupdateTextAreaInput
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()
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
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’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
generateOptions
function. (#1702)Fixed #1710:
ReactiveVal
objects 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)