Upgrade notes for Shiny 1.3.0

This release features plot caching, an important new tool for improving performance and scalability. Using renderCachedPlot in place of renderPlot can greatly improve responsiveness for apps that show the same plot many times (for example, a dashboard or report where all users view the same data). Shiny gives you a fair amount of control in where the cache is stored and how cached plots are invalidated, so be sure to read this article to get the most out of this feature.

Full changelog

New features

  • Revamped Shiny’s reactlog viewer which debugs reactivity within a shiny application. This allows users to traverse the reactivity history of a shiny application, filter to the dependency tree of a selected reactive object, and search for matching reactive objects. See ?reactlogShow for more details and how to enable this feature. (#2107)

  • Shiny now serves static files on a background thread. This means that things like JavaScript and CSS assets can be served without blocking or being blocked by the main R thread, and should result in significantly better performance for heavily loaded servers. (#2280)

Minor new features and improvements

  • The Shiny-Shared-Secret security header is now checked using constant-time comparison to prevent timing attacks (thanks @dirkschumacher!). (#2319)

Bug fixes

  • Fixed #2245: updateSelectizeInput() did not update labels. (#2248)

  • Fixed #2308: When restoring a bookmarked application, inputs with a leading . would not be restored. (#2311)

  • Fixed #2305, #2322, #2351: When an input in dynamic UI is restored from bookmarks, it would keep getting set to the same value. (#2360)

  • Fixed #2349, #2329, #1817: These were various bugs triggered by the presence of the networkD3 package’s Sankey plot in an app. Impacted features included dateRangeInput, withProgressBar, and bookmarking (#2359)

Documentation Updates

  • Fixed #2247: renderCachedPlot now supports using promises for either expr or cacheKeyExpr. (Shiny v1.2.0 supported async expr, but only if cacheKeyExpr was async as well; now you can use any combination of sync/async for expr and cacheKeyExpr.) #2261