--- title: "Integrating the shinyStorePlus R package into Shiny applications" author: "Obinna N. Obianom" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Integrating the shinyStorePlus R package into Shiny applications} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ## Introduction __Create a shiny app such that when a user refreshed the app, they can still see the input they entered.__ Integrating the shinyStorePlus package into your already developed application is very simple and can be accomplished in just few lines of code. Neat, right? Well, get started ... ## Step 1: An already working application Below is the code for an application to which we will integrate the shinyStorePlus package ```{r eval=FALSE,echo=TRUE} # library library(shiny) if(interactive()) { ui <- fluidPage( # Application title titlePanel("shinyStorePlus by Obi Obianom"), # Sidebar with a slider input for number of bins sidebarLayout( sidebarPanel( sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30), selectizeInput( 'foo', label = NULL, choices = state.name, options = list(create = TRUE), multiple = TRUE ), textInput("redd","What if I?",value = "Wayword...") ), # Show a plot of the generated distribution mainPanel( plotOutput("distPlot") ) ) ) server <- function(input,output,session) { # make sure the input, output, session arguments are present !IMPORTANT output$distPlot <- renderPlot({ # generate bins based on input$bins from ui.R x <- faithful[, 2] bins <- seq(min(x), max(x), length.out = input$bins + 1) # draw the histogram with the specified number of bins hist(x, breaks = bins, col = 'darkgray', border = 'white', xlab = 'Waiting time to next eruption (in mins)', main = 'Histogram of waiting times') }) } shinyApp(ui = ui, server = server) } ``` ## Step 2: Install and attach the shinyStorePlus R package The shinyStorePlus package is available on CRAN and can be installed as shown below `install.packages(shinyStorePlus)` Attach library `library(shinyStorePlus)` Now, the code you have should look like this ... ```{r eval=FALSE,echo=TRUE} # library library(shiny) library(shinyStorePlus) if(interactive()) { ui <- fluidPage( # Application title titlePanel("shinyStorePlus by Obi Obianom"), # Sidebar with a slider input for number of bins sidebarLayout( sidebarPanel( sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30), selectizeInput( 'foo', label = NULL, choices = state.name, options = list(create = TRUE), multiple = TRUE ), textInput("redd","What if I?",value = "Wayword...") ), # Show a plot of the generated distribution mainPanel( plotOutput("distPlot") ) ) ) server <- function(input,output,session) { # make sure the input, output, session arguments are present !IMPORTANT output$distPlot <- renderPlot({ # generate bins based on input$bins from ui.R x <- faithful[, 2] bins <- seq(min(x), max(x), length.out = input$bins + 1) # draw the histogram with the specified number of bins hist(x, breaks = bins, col = 'darkgray', border = 'white', xlab = 'Waiting time to next eruption (in mins)', main = 'Histogram of waiting times') }) } shinyApp(ui = ui, server = server) } ``` ## Step 3: Initialize by including the scripts required for processing the stores You must initialize for the package to work. Its as simple as inserting the function below within the fluidPage() `initStore()` Now, the code you have should look like this ... ```{r eval=FALSE,echo=TRUE} # library library(shiny) library(shinyStorePlus) if (interactive()) { ui <- fluidPage( # Initialize shinyStorePlus initStore(), # Application title titlePanel("shinyStorePlus by Obi Obianom"), # Sidebar with a slider input for number of bins sidebarLayout( sidebarPanel( sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30 ), selectizeInput( "foo", label = NULL, choices = state.name, options = list(create = TRUE), multiple = TRUE ), textInput("redd", "What if I?", value = "Wayword...") ), # Show a plot of the generated distribution mainPanel( plotOutput("distPlot") ) ) ) server <- function(input, output, session) { # make sure the input, output, session arguments are present !IMPORTANT output$distPlot <- renderPlot({ # generate bins based on input$bins from ui.R x <- faithful[, 2] bins <- seq(min(x), max(x), length.out = input$bins + 1) # draw the histogram with the specified number of bins hist(x, breaks = bins, col = "darkgray", border = "white", xlab = "Waiting time to next eruption (in mins)", main = "Histogram of waiting times" ) }) } shinyApp(ui = ui, server = server) } ``` ## Step 4: Setup storage in the server function Setup the stores by declaring a unique app id and including this in the setup function as shown below `appid = "applicatio32n501"` `setupStorage(appId = appid,inputs = TRUE)` Now, the code you have should look like this ... ```{r eval=FALSE,echo=TRUE} # library library(shiny) library(shinyStorePlus) if (interactive()) { ui <- fluidPage( # Initialize shinyStorePlus initStore(), # Application title titlePanel("shinyStorePlus by Obi Obianom"), # Sidebar with a slider input for number of bins sidebarLayout( sidebarPanel( sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30 ), selectizeInput( "foo", label = NULL, choices = state.name, options = list(create = TRUE), multiple = TRUE ), textInput("redd", "What if I?", value = "Wayword...") ), # Show a plot of the generated distribution mainPanel( plotOutput("distPlot") ) ) ) server <- function(input, output, session) { # make sure the input, output, session arguments are present !IMPORTANT output$distPlot <- renderPlot({ # generate bins based on input$bins from ui.R x <- faithful[, 2] bins <- seq(min(x), max(x), length.out = input$bins + 1) # draw the histogram with the specified number of bins hist(x, breaks = bins, col = "darkgray", border = "white", xlab = "Waiting time to next eruption (in mins)", main = "Histogram of waiting times" ) }) # insert at the bottom !!!IMPORTANT appid <- "applicatio32n501" setupStorage(appId = appid, inputs = TRUE) } shinyApp(ui = ui, server = server) } ``` ## Step 5: Run the final code Paste the final R code into your console and run. Change several inputs when the application loads, see the effect. Now, refresh the page. You should see that your previous inputs are preserved. ## Official links Documentation: https://shinystoreplus.obi.obianom.com Code and report issues: https://github.com/oobianom/shinyStorePlus