File: README.md
shiny
Easily build rich and productive interactive web apps in R — no HTML/CSS/JavaScript required.
Features
- An intuitive and extensible reactive programming model which makes it easy to transform existing R code into a "live app" where outputs automatically react to new user input.
- Compared to event-based programming, reactivity allows Shiny to do the minimum amount of work when input(s) change, and allows humans to more easily reason about complex MVC logic.
- A prebuilt set of highly sophisticated, customizable, and easy-to-use widgets (e.g., plots, tables, sliders, dropdowns, date pickers, and more).
- An attractive default look based on Bootstrap which can also be easily customized with the bslib package or avoided entirely with more direct R bindings to HTML/CSS/JavaScript.
- Seamless integration with R Markdown, making it easy to embed numerous applications natively within a larger dynamic document.
- Tools for improving and monitoring performance, including native support for async programming, caching, load testing, and more.
- Modules: a framework for reducing code duplication and complexity.
- An ability to bookmark application state and/or generate code to reproduce output(s).
- A rich ecosystem of extension packages for more custom widgets, input validation, unit testing, and more.
Installation
To install the stable version from CRAN:
install.packages("shiny")Getting Started
Once installed, load the library and run an example:
library(shiny)
# Launches an app, with the app's source code included
runExample("06_tabsets")
# Lists more prepackaged examples
runExample()For more examples and inspiration, check out the Shiny User Gallery.
For help with learning fundamental Shiny programming concepts, check out the Mastering Shiny book and the Shiny Tutorial. The former is currently more up-to-date with modern Shiny features, whereas the latter takes a deeper, more visual, dive into fundamental concepts.
Join the conversation
If you want to chat about Shiny, meet other developers, or help us decide what to work on next, join us on Discord.
Getting Help
To ask a question about Shiny, please use the RStudio Community website.
For bug reports, please use the issue tracker and also keep in mind that by writing a good bug report, you're more likely to get help with your problem.
Contributing
We welcome contributions to the shiny package. Please see our CONTRIBUTING.md file for detailed guidelines of how to contribute.
License
The shiny package as a whole is licensed under the MIT License. See the LICENSE file for more details.
R version support
Shiny is supported on the latest release version of R, as well as the previous four minor release versions of R. For example, if the latest release R version is 4.3, then that version is supported, as well as 4.2, 4.1, 4.0, 3.6.
File: inst/examples-shiny/11_timer/Readme.md
The function invalidateLater() can be used to invalidate an observer or
reactive expression in a given number of milliseconds. In this example, the
output currentTime is updated every second, so it shows the current time
on a second basis.
File: inst/examples-shiny/10_download/Readme.md
We can add a download button to the UI using downloadButton(), and write
the content of the file in downloadHandler() in the server function.
File: inst/examples-shiny/09_upload/Readme.md
We can add a file upload input in the UI using the function fileInput(),
e.g. fileInput('foo'). In the server function, we can access the
uploaded files via input$foo.
File: inst/examples-shiny/08_html/Readme.md
Normally we use the built-in functions, such as textInput(), to generate the HTML UI in the R script ui.R. Actually shiny also works with a custom HTML page www/index.html. See the tutorial for more details.
File: inst/examples-shiny/07_widgets/Readme.md
This example demonstrates some additional widgets included in Shiny, such as helpText and actionButton. The latter is used to delay rendering output until the user explicitly requests it (a construct which also introduces two important server functions, eventReactive and isolate).
File: inst/examples-shiny/06_tabsets/Readme.md
This example demonstrates the navset_* and nav_panel widgets from the bslib package.
Notice that outputs that are not visible are not re-evaluated until they become visible. Try this:
- Scroll to the bottom of the
serverfunction. You might need to use the show with app option so you can easily view the code and interact with the app at the same time. - Change the number of observations, and observe that only
output$plotis evaluated. - Click the Summary tab, and observe that
output$summaryis evaluated. - Change the number of observations again, and observe that now only
output$summaryis evaluated.
File: inst/examples-shiny/05_sliders/Readme.md
This example demonstrates Shiny's versatile sliderInput widget.
Slider inputs can be used to select single values, to select a continuous range of values, and even to animate over a range.
File: inst/examples-shiny/04_mpg/Readme.md
This example demonstrates the following concepts:
- Global variables: The
mpgDatavariable is declared outside of theuiandserverfunction definitions. This makes it available anywhere insideapp.R. The code inapp.Routside ofuiandserverfunction definitions is only run once when the app starts up, so it can't contain user input. - Reactive expressions:
formulaTextis a reactive expression. Note how it re-evaluates when the Variable field is changed, but not when the Show Outliers box is unchecked.
File: inst/examples-shiny/03_reactivity/Readme.md
This example demonstrates a core feature of Shiny: reactivity. In the server function, a reactive called datasetInput is declared.
Notice that the reactive expression depends on the input expression input$dataset, and that it's used by two output expressions: output$summary and output$view. Try changing the dataset (using Choose a dataset) while looking at the reactive and then at the outputs; you will see first the reactive and then its dependencies flash.
Notice also that the reactive expression doesn't just update whenever anything changes--only the inputs it depends on will trigger an update. Change the "Caption" field and notice how only the output$caption expression is re-evaluated; the reactive and its dependents are left alone.