Skip to content

Releases: rstudio/shiny

shiny 1.8.1.1

03 Apr 14:27
5e566a0
Compare
Choose a tag to compare

In v1.8.1, shiny.js starting throwing an error when input/output bindings have duplicate IDs. This error is now only thrown when shiny::devmode(TRUE) is enabled, so the issue is still made discoverable through the JS error console, but avoids unnecessarily breaking apps that happen to work with duplicate IDs. (#4019)

shiny 1.8.1

27 Mar 15:03
e8cdc78
Compare
Choose a tag to compare

New features and improvements

  • Added ExtendedTask, a new simple way to launch long-running asynchronous tasks that are truly non-blocking. That is, even within a session, an ExtendedTask won't block the main thread from flushing the reactive graph (i.e., UI updates won't be blocked). ExtendedTask pairs nicely with new bslib::input_task_button() and bslib::bind_task_button() functions, which help give user feedback and prevent extra button clicks. (#3958)

  • Added a JavaScript error dialog, reporting errors that previously were only discoverable by opening the browser's devtools open. Since this dialog is mainly useful for debugging and development, it must be enabled with shiny::devmode(). (#3931)

  • runExamples() now uses the {bslib} package to generate a better looking result. It also gains a package argument so that other packages can leverage this same function to run Shiny app examples. For more, see ?runExamples. (#3963, #4005)

  • Added onUnhandledError() to register a function that will be called when an unhandled error occurs in a Shiny app. Note that this handler doesn't stop the error or prevent the session from closing, but it can be used to log the error or to clean up session-specific resources. (thanks @JohnCoene, #3993)

Changes

  • renderDataTable()/dataTableOutput() are officially deprecated in favor of their {DT} equivalents. Migrating to {DT}, in most cases, just requires changing renderDataTable() to DT::renderDT() and dataTableOutput() to DT::DTOutput(). Also, to promote migration, when a recent version of {DT} is available, renderDataTable()/dataTableOutput() now automatically use their {DT} equivalent (and provide a message that they are doing so). If this happens to degrade an existing app, set options(shiny.legacy.datatable = TRUE) to get the old (i.e., non-{DT}) implementation. (#3998)

  • Both conditionalPanel() and uiOutput() are now styled with display: contents by default in Shiny apps that use Bootstrap 5. This means that the elements they contain are positioned as if they were direct children of the parent container holding the conditionalPanel() or uiOutput(). This is probably what most users intend when they use these functions, but it may break apps that applied styles directly to the container elements created by these two functions. In that case, you may include CSS rules to set display: block for the .shiny-panel-conditional or .shiny-html-output classes. (#3957, #3960)

Bug fixes

  • Notifications are now constrained to the width of the viewport for window widths smaller the default notification panel size. (#3949)

  • Fixed #2392: downloadButton() now visibly returns its HTML tag so that it renders correctly in R Markdown and Quarto output. (Thanks to @fennovj, #2672)

  • Calling updateSelectizeInput() with choices and selected now clears the current selection before updating the choices and selected value. (#3967)

  • Loading a Shiny app in a package-like directory will no longer warn if autoloading is disabled by the presence of an R/_disable_autoload.R file. (Thanks to @krlmlr and @tanho63, #3513)

shiny 1.8.0

20 Nov 18:56
283c71e
Compare
Choose a tag to compare

Breaking changes

  • Closed #3899: The JS function Shiny.bindAll() is now asynchronous. This change is driven by the recent push toward making dynamic UI rendering asynchronous, which is necessary for shinylive (and should've happened when it was first introduced in Shiny v1.7.5). The vast majority of existing Shiny.bindAll() uses should continue to work as before, but some cases may break if downstream code relies on it being synchronous (i.e., blocking the main thread). In this case, consider placing any downstream code in a .then() callback (or await the result in a async function). (#3929)
    • Since renderContent() calls bindAll() (after it inserts content), it now returns a Promise<void> instead of void, which can be useful if downstream code needs to wait for the binding to complete.

New features and improvements

  • Updated selectizeInput()'s selectize.js dependency from v0.12.4 to v0.15.2. In addition to many bug fixes and improvements, this update also adds several new plugin options. (#3875)

  • Shiny's CSS styling (for things like showNotification(), withProgress(), inputPanel(), etc.), has been updated with {bslib}'s upcoming CSS-only dark mode feature in mind. (#3882, #3914)

  • Default styles for showNotification() were tweaked slightly to improve accessibility, sizing, and padding. (#3913)

  • Shiny inputs and {htmlwidgets} are no longer treated as draggable inside of absolutePanel()/fixedPanel() with draggable = TRUE. As a result, interactions like zooming and panning now work as expected with widgets like {plotly} and {leaflet} when they appear in a draggable panel. (#3752, #3933)

  • For InputBindings, the .receiveMessage() method can now be asynchronous or synchronous (previously it could only be synchronous). (#3930)

Bug fixes

  • fileInput() no longer has unwanted round corners applied to the buttonLabel. (#3879)

  • Fixed #3898: wrapFunctionLabel() no longer throws an error if the name is longer than 10000 bytes. (#3903)

shiny 1.7.5.1

16 Oct 15:03
Compare
Choose a tag to compare

Bug fixes

  • On r-devel (R > 4.3.1), isTruthy(NULL) now returns FALSE (as it does with older versions of R). (#3906)

shiny 1.7.5

14 Aug 14:52
0b97ee1
Compare
Choose a tag to compare

Possibly breaking changes

  • For reactiveValues() objects, whenever the $names() or $values() methods are called, the keys are now returned in the order that they were inserted. (#3774)

  • The value provided to options(shiny.json.digits) is now interpreted as number of digits after the decimal instead of significant digits. To treat the value as significant digits, wrap it in I() (e.g., options(shiny.json.digits = I(4))). This new default behavior not only helps with reducing digits in testing snapshots, but is also more consistent with {jsonlite}'s default behavior. (#3819)

New features and improvements

  • Closed #789: Dynamic UI is now rendered asynchronously, thanks in part to the newly exported Shiny.renderDependenciesAsync(), Shiny.renderHtmlAsync(), and Shiny.renderContentAsync(). Importantly, this means <script> tags are now loaded asynchronously (the old way used XMLHttpRequest, which is synchronous). In addition, Shiny now manages a queue of async tasks (exposed via Shiny.shinyapp.taskQueue) so that order of execution is preserved. (#3666)

  • Fixes #3840: updateSliderInput() now warns when attempting to set invalid min, max, or value values. Sending an invalid update message to an input no longer causes other update messages to fail. (#3843)

  • sliderInput() now has a larger target area for clicking or tapping on the slider handle or range. (#3859)

  • Closed #2956: Component authors can now prevent Shiny from creating an input binding on specific elements by adding the data-shiny-no-bind-input attribute to the element. The attribute may have any or no value; its presence will prevent binding. This feature is primarily useful for input component authors who want to use standard HTML input elements without causing Shiny to create an input binding for them. Additionally, Shiny now adds custom classes to its inputs. For example, checkboxInput() now has a shiny-input-checkbox class. These custom classes may be utilized in future updates to Shiny's input binding logic. (#3861)

  • Map objects are now initialized at load time instead of build time. This avoids potential problems that could arise from storing fastmap objects into the built Shiny package. (#3775)

Bug fixes

  • Fixed #3771: Sometimes the error ion.rangeSlider.min.js: i.stopPropagation is not a function would appear in the JavaScript console. (#3772)

  • Fixed #3833: When width is provided to textAreaInput(), we now correctly set the width of the <textarea> element. (#3838)