The goal of {scenes} is to make it easy to switch a {shiny} app between alternative UIs. It was designed to abstract the login-wrapper concept implemented in {shinyslack}.
Install the released version of {scenes} from CRAN:
install.packages("scenes")
Or install the development version of scenes from GitHub with:
# install.packages("remotes")
::install_github("r4ds/scenes") remotes
You can see a demonstration of {scenes} here.
Some examples of how you might use {scenes} to switch between different UIs in a Shiny app:
Login Wrapper: Use {scenes} to switch between a login page and the main content of the app. This is the original use case for {scenes}. It ws designed to abstract the login-wrapper concept implemented in {shinyslack}.
App Modes: Use {scenes} to switch between
different modes of the app, such as a view-only mode and an edit mode,
via a query parameter
(yourapp.shinyapps.io?mode=edit
).
User Roles: Use {scenes} to switch between different UIs based on user roles. For example, a non-admin user might see a different UI than an admin user.
The Login Wrapper example might look like this:
library(shiny)
library(scenes)
# Define the different scenes for the app
<- fluidPage(
login_ui textInput("username", "Username"),
passwordInput("password", "Password"),
actionButton("login", "Login")
)
<- fluidPage(
main_ui h1("Welcome"),
textOutput("username")
)
# Use the `set_scene()` function to define the different scenes, and
# `change_scene()` to switch between them.
<- change_scene(
ui set_scene(
main_ui,req_has_cookie(
"validate_login",
validation_fn = my_validation_fn
)
),fall_through = login_ui
)
<- function(input, output, session) {
server observeEvent(input$login, {
use_cookies_package_to_save_cookie_fn(input$username, input$password)
})
$username <- renderText({
output$username
input
})
}
shinyApp(ui = ui, server = server)
See {shinyslack} for a fully implemented example.
Other packages have implemented features in this domain.
Please note that the scenes project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.