shiny 1.0.5

Full changelog

Bug fixes

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

Minor new features and improvements

Bug fixes

shiny 1.0.3

This is a hotfix release of Shiny. With previous versions of Shiny, when running an application on the newly-released version of R, 3.4.0, it would print a message: Warning in body(fun) : argument is not a function. This has no effect on the application, but because the message could be alarming to users, we are releasing a new version of Shiny that fixes this issue.

Full changelog

Bug fixes

shiny 1.0.2

This is a hotfix release of Shiny. The primary reason for this release is because the web host for MathJax JavaScript library is scheduled to be shut down in the next few weeks. After it is shut down, Shiny applications that use MathJax will no longer be able to load the MathJax library if they are run with Shiny 1.0.1 and below. (If you don’t know whether your application uses MathJax, it probably does not.) For more information about why the MathJax CDN is shutting down, see

Full changelog

Minor new features and improvements

Bug fixes

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

New features

Minor new features and improvements

Bug fixes

Library updates

shiny 1.0.0

Shiny has reached a milestone: version 1.0.0! In the last year, we’ve added two major features that we considered essential for a 1.0.0 release: bookmarking, and support for testing Shiny applications. As usual, this version of Shiny also includes many minor features and bug fixes.

Here are some highlights from this release. For more details, see the full changelog below.

Support for testing Shiny applications

Shiny now supports automated testing of applications, with the shinytest package. Shinytest has not yet been released on CRAN, but will be soon. (#18, #1464)

Debounce/throttle reactives

Now there’s an official way to slow down reactive values and expressions that invalidate too quickly. Pass a reactive expression to the new debounce or throttle function, and get back a modified reactive expression that doesn’t invalidate as often. (#1510)

Full changelog

Breaking changes

New features

Minor new features and improvements

Bug fixes

Library updates

shiny 0.14.2

This is a maintenance release of Shiny, with some bug fixes and minor new features.

Full changelog

Minor new features and improvements

Bug fixes

shiny 0.14.1

This is a maintenance release of Shiny, with some bug fixes and minor new features.

Full changelog

Minor new features and improvements

Bug fixes

Library updates

shiny 0.14

A new Shiny release is upon us! There are many new exciting features, bug fixes, and library updates. We’ll just highlight the most important changes here, but you can browse through the full changelog below for details. This will likely be the last release before shiny 1.0, so get out your party hats!

Bookmarkable state

Shiny now supports bookmarkable state: users can save the state of an application and get a URL which will restore the application with that state. There are two types of bookmarking: encoding the state in a URL, and saving the state to the server. With an encoded state, the entire state of the application is contained in the URL’s query string. You can see this in action with this app: An example of a bookmark URL for this app is When the state is saved to the server, the URL might look something like: (note that this URL is not for an active app).

Important note: > Saved-to-server bookmarking currently works with Shiny Server Open Source. Support on Shiny Server Pro, RStudio Connect, and is under development and testing. However, URL-encoded bookmarking works on all hosting platforms.

See this article to get started with bookmarkable state. There is also an advanced-level article (for apps that have a complex state), and a modules article that details how to use bookmarking in conjunction with modules.


Shiny can now display notifications on the client browser by using the showNotification() function. Use this demo app to play around with the notification API. Here’s a screenshot of a very simple notification (shown when the button is clicked):


Here’s our article about it, and the reference documentation.

Progress indicators

If your Shiny app contains computations that take a long time to complete, a progress bar can improve the user experience by communicating how far along the computation is, and how much is left. Progress bars were added in Shiny 0.10.2. In Shiny 0.14, they were changed to use the notifications system, which gives them a different look.

Important note: > If you were already using progress bars and had customized them with your own CSS, you can add the style = "old" argument to your withProgress() call (or Progress$new()). This will result in the same appearance as before. You can also call shinyOptions( = "old") in your app’s server function to make all progress indicators use the old styling.

To see new progress bars in action, see this app in the gallery. You can also learn more about this in our article and in the reference documentation (either for the easier withProgress functional API or the more complicated, but more powerful, Progress object-oriented API.


Shiny can now automatically reconnect to your Shiny session if you temporarily lose network access.

Shiny has now built-in support for displaying modal dialogs like the one below (live app here):


To learn more about this, read our article and the reference documentation.

insertUI and removeUI

Sometimes in a Shiny app, arbitrary HTML UI may need to be created on-the-fly in response to user input. The existing uiOutput and renderUI functions let you continue using reactive logic to call UI functions and make the results appear in a predetermined place in the UI. The insertUI and removeUI functions, which are used in the server code, allow you to use imperative logic to add and remove arbitrary chunks of HTML (all independent from one another), as many times as you want, whenever you want, wherever you want. This option may be more convenient when you want to, for example, add a new model to your app each time the user selects a different option (and leave previous models unchanged, rather than substitute the previous one for the latest one).

See this simple demo app of how one could use insertUI and removeUI to insert and remove text elements using a queue. Also see this other app that demonstrates how to insert and remove a few common Shiny input objects. Finally, this app shows how to dynamically insert modules using insertUI.

For more, read our article about dynamic UI generation and the reference documentation about insertUI and removeUI.

Documentation for connecting to an external database

Many Shiny users have asked about best practices for accessing external databases from their Shiny applications. Although database access has long been possible using various database connector packages in R, it can be challenging to use them robustly in the dynamic environment that Shiny provides. So far, it has been mostly up to application authors to find the appropriate database drivers and to discover how to manage the database connections within an application. In order to demystify this process, we wrote a series of articles (first one here) that covers the basics of connecting to an external database, as well as some security precautions to keep in mind (e.g. how to avoid SQL injection attacks).

There are a few packages that you should look at if you’re using a relational database in a Shiny app: the dplyr and DBI packages (both featured in the article linked to above), and the brand new pool package, which provides a further layer of abstraction to make it easier and safer to use either DBI or dplyr. pool is not yet on CRAN. In particular, pool will take care of managing connections, preventing memory leaks, and ensuring the best performance. See this pool basics article and the more advanced-level article if you’re feeling adventurous! (Both of these articles contain Shiny app examples that use DBI to connect to an external MySQL database.) If you are more comfortable with dplyr than DBI, don’t miss the article about the integration of pool and dplyr.

If you’re new to databases in the Shiny world, we recommend using dplyr and pool if possible. If you need greater control than dplyr offers (for example, if you need to modify data in the database or use transactions), then use DBI and pool. The pool package was introduced to make your life easier, but in no way constrains you, so we don’t envision any situation in which you’d be better off not using it. The only caveat is that pool is not yet on CRAN, so you may prefer to wait for that.


There are many more minor features, small improvements, and bug fixes than we can cover here, so we’ll just mention a few of the more noteworthy ones (the full changelog, with links to all the relevant issues and pull requests, is right below this section):

Full changelog

Breaking changes

New features

Minor new features and improvements

Bug fixes

Library updates

shiny 0.13.2

shiny 0.13.1

shiny 0.13.0

shiny 0.12.2

shiny 0.12.1

shiny 0.12.0

In addition to the changes listed below (in the Full Changelog section), there is an infrastructure change that could affect existing Shiny apps.

JSON serialization

In Shiny 0.12.0, we’ve switched from RJSONIO to jsonlite. For the vast majority of users, this will result in no noticeable changes; however, if you use any packages in your Shiny apps which rely on the htmlwidgets, you will also need to update htmlwidgets to 0.4.0. Both of these packages will issue a message when loaded, if the other package needs to be upgraded.

POSIXt objects are now serialized to JSON in UTC8601 format (like “2015-03-20T20:00:00Z”), instead of as seconds from the epoch. If you have a Shiny app which uses sendCustomMessage() to send datetime (POSIXt) objects, then you may need to modify your Javascript code to receive time data in this format.

A note about Data Tables

Shiny 0.12.0 deprecated Shiny’s dataTableOutput and renderDataTable functions and instructed you to migrate to the nascent DT package instead. (We’ll talk more about DT in a future blog post.) User feedback has indicated this transition was too sudden and abrupt, so we’ve undeprecated these functions in 0.12.1. We’ll continue to support these functions until DT has had more time to mature.

Full Changelog

shiny 0.11.1

shiny 0.11

Shiny 0.11 switches away from the Bootstrap 2 web framework to the next version, Bootstrap 3. This is in part because Bootstrap 2 is no longer being developed, and in part because it allows us to tap into the ecosystem of Bootstrap 3 themes.

Known issues for migration

If you encounter other migration issues, please let us know on the shiny-discuss mailing list, or on the Shiny issue tracker.

Using shinybootstrap2

If you would like to use Shiny 0.11 with Bootstrap 2, you can use the shinybootstrap2 package. Installation and usage instructions are on available on the project page. We recommend that you do this only as a temporary solution because future development on Shiny will use Bootstrap 3.

Installing an older version of Shiny

If you want to install a specific version of Shiny other than the latest CRAN release, you can use the install_version() function from devtools:

# Install devtools if you don't already have it:

# Install the last version of Shiny prior to 0.11
devtools::install_version("shiny", "")


Along with the release of Shiny 0.11, we’ve packaged up some Bootstrap 3 themes in the shinythemes package. This package makes it easy to use Bootstrap themes with Shiny.

Full Changelog



shiny 0.10.2

shiny 0.10.1

shiny 0.10.0

shiny 0.9.1

shiny 0.9.0

shiny 0.8.0

shiny 0.7.0

shiny 0.6.0

shiny 0.5.0

shiny 0.4.1

shiny 0.4.0

shiny 0.3.1

shiny 0.3.0

shiny 0.2.4

shiny 0.2.3

shiny 0.2.2

shiny 0.2.1

shiny 0.2.0

shiny 0.1.14

shiny 0.1.13

shiny 0.1.12

shiny 0.1.11

shiny 0.1.10

shiny 0.1.9

shiny 0.1.8

shiny 0.1.7

shiny 0.1.6

shiny 0.1.5

shiny 0.1.4

shiny 0.1.3

shiny 0.1.2