Upgrade notes for Shiny 1.0.1

This is a maintenance release of Shiny, mostly aimed at fixing bugs and introducing minor features. The most notable additions in this version of Shiny are the introduction of the reactiveVal() function (it’s like reactiveValues(), but it only stores a single value), and that the choices of radioButtons() and checkboxGroupInput() can now contain HTML content instead of just plain text.

Full changelog

Breaking changes

  • The functions radioButtons(), checkboxGroupInput() and selectInput() (and the corresponding updateXXX() functions) no longer accept a selected argument whose value is the name of a choice, instead of the value of the choice. This feature had been deprecated since Shiny 0.10 (it printed a warning message, but still tried to match the name to the right choice) and it’s now completely unsupported.

New features

  • Added reactiveVal function, for storing a single value which can be (reactively) read and written. Similar to reactiveValues, except that reactiveVal just lets you store a single value instead of storing multiple values by name. (#1614)

Minor new features and improvements

  • Addressed #1348 and #1437 by adding two new arguments to radioButtons() and checkboxGroupInput(): choiceNames (list or vector) and choiceValues (list or vector). These can be passed in as an alternative to choices, with the added benefit that the elements in choiceNames can be arbitrary UI (i.e. anything created by HTML() and the tags() functions, like icons and images). While the underlying values for each choice (passed in through choiceValues) must still be simple text, their visual representation on the app (what the user actually clicks to select a different option) can be any valid HTML element. See ?radioButtons for a small example. (#1521)

  • Updated tools/README.md with more detailed instructions. (##1616)

  • Fixed #1565, which meant that resources with spaces in their names return HTTP 404. (#1566)

  • Exported session$user (if it exists) to the client-side; it’s accessible in the Shiny object: Shiny.user. (#1563)

  • Added support for HTML5’s pushState which allows for pseudo-navigation in shiny apps. For more info, see the documentation (?updateQueryString and ?getQueryString). (#1447)

  • Fixed #1121: plot interactions with ggplot2 now support coord_fixed(). (#1525)

  • Added snapshotExclude function, which marks an output so that it is not recorded in a test snapshot. (#1559)

  • Added shiny:filedownload JavaScript event, which is triggered when a downloadButton or downloadLink is clicked. Also, the values of downloadHandlers are not recorded in test snapshots, because the values change every time the application is run. (#1559)

  • Added support for plot interactions with ggplot2 > 2.2.1. (#1578)

  • Fixed #1577: Improved escapeHTML (util.js) in terms of the order dependency of replacing, XSS risk attack and performance. (#1579)

  • The shiny:inputchanged JavaScript event now includes two new fields, binding and el, which contain the input binding and DOM element, respectively. Additionally, Shiny.onInputChange() now accepts an optional argument, opts, which can contain the same fields. (#1596)

  • The NS() function now returns a vectorized function. (#1613)

  • Fixed #1617: fileInput can have customized text for the button and the placeholder. (#1619)

Bug fixes

  • Fixed #1511: fileInputs did not trigger the shiny:inputchanged event on the client. Also removed shiny:fileuploaded JavaScript event, because it is no longer needed after this fix. (#1541, #1570)

  • Fixed #1472: With a Progress object, calling set(value=NULL) made the progress bar go to 100%. Now it does not change the value of the progress bar. The documentation also incorrectly said that setting the value to NULL would hide the progress bar. (#1547)

  • Fixed #162: When a dynamically-generated input changed to a different inputType, it might be incorrectly deduplicated. (#1594)

  • Removed redundant call to inputs.setInput. (#1595)

  • Fixed bug where dateRangeInput did not respect weekstart argument. (#1592)

  • Fixed #1598: setBookmarkExclude() did not work properly inside of modules. (#1599)

  • Fixed #1605: sliders did not move when clicked on the bar area. (#1610)

  • Fixed #1621: if a reactiveTimer’s session was closed before the first time that the reactiveTimer fired, then the reactiveTimer would not get cleared and would keep firing indefinitely. (#1623)

Library updates

  • Closed #1500: Updated ion.rangeSlider to 2.1.6. (#1540)