I have this code:
library(shiny)
library(shinyglide)
ui <- fixedPage(
titlePanel("shinyglide modal example"),
actionButton(
inputId = "actionlatex1",
label = "click"
),
sidebarLayout(
sidebarPanel(
numericInput("mean", "Mean", value = 0),
numericInput("sd", "Standard deviation", value = 1, min = 0),
numericInput("n", "n", value = 100, min = 1),
p(
tags$a(
href = "https://github.com/juba/shinyglide/blob/master/inst/examples/03_modal/app.R",
"Source code on GitHub"
)
)
),
mainPanel(
plotOutput("plot")
)
)
)
server <- function(input, output, session) {
modal_controls <- glideControls(
list(
prevButton(),
firstButton(
class = "btn btn-danger",
`data-dismiss` = "modal",
"No, thanks!"
)
),
list(
nextButton(),
lastButton(
class = "btn btn-success",
`id` = "save",
`data-dismiss` = "modal",
"Done"
)
)
)
observeEvent(input$actionlatex1, {
showModal(
modalDialog(
title = "Startup assistant",
easyClose = FALSE,
footer = NULL,
glide(
custom_controls = modal_controls,
screen(
next_label = 'Yes, please ! <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>',
p("Let's initialize some values, would you ?")
),
screen(
p("First, please select a mean value"),
numericInput("mean_modal", "Mean", value = 0)
),
screen(
p("Next, please select a standard deviation value"),
numericInput("sd_modal", "Standard deviation", value = 1, min = 0)
),
screen(
p("Thanks, we're all set !")
)
)
)
)
})
output$plot <- renderPlot({
hist(rnorm(req(input$n), req(input$mean), req(input$sd)),
main = "Such wow",
xlab = "Wonderful x values",
ylab = "Incredible frequencies")
})
observe({
updateNumericInput(session, "mean_modal", value = input$mean)
updateNumericInput(session, "sd_modal", value = input$sd)
})
}
shinyApp(ui, server)
I would like to store the values of the inputs (mean, sd and n) so that when I reopen and close the modal the values remain there when I modify them.
I tried using a javascript but it got confusing, so I decided to remove it from the current code. I also tried to create a modal with jquery, but I didn't succeed either. I need to save the R inputs when closing and reopening the modal.
You can use reactiveValues
to initialize the inputs once the modal is shown:
library(shiny)
library(shinyglide)
ui <- fixedPage(
titlePanel("shinyglide modal example"),
actionButton(
inputId = "actionlatex1",
label = "click"
),
sidebarLayout(
sidebarPanel(
numericInput("mean", "Mean", value = 0),
numericInput("sd", "Standard deviation", value = 1, min = 0),
numericInput("n", "n", value = 100, min = 1),
p(
tags$a(
href = "https://github.com/juba/shinyglide/blob/master/inst/examples/03_modal/app.R",
"Source code on GitHub"
)
)
),
mainPanel(
plotOutput("plot")
)
)
)
server <- function(input, output, session) {
modal_controls <- glideControls(
list(
prevButton(),
firstButton(
class = "btn btn-danger",
`data-dismiss` = "modal",
"No, thanks!"
)
),
list(
nextButton(),
lastButton(
class = "btn btn-success",
`id` = "save",
`data-dismiss` = "modal",
"Done"
)
)
)
modal_inputs <- reactiveValues(mean_modal = 0L, sd_modal = 1L)
observe({
lapply(names(modal_inputs), function(x){
if(!is.null(input[[x]])){
modal_inputs[[x]] <- input[[x]]
}
})
})
observeEvent(input$actionlatex1, {
showModal(
modalDialog(
title = "Startup assistant",
easyClose = FALSE,
footer = NULL,
glide(
custom_controls = modal_controls,
screen(
next_label = 'Yes, please ! <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>',
p("Let's initialize some values, would you ?")
),
screen(
p("First, please select a mean value"),
numericInput("mean_modal", "Mean", value = modal_inputs$mean_modal)
),
screen(
p("Next, please select a standard deviation value"),
numericInput("sd_modal", "Standard deviation", value = modal_inputs$sd_modal, min = 0)
),
screen(
p("Thanks, we're all set !")
)
)
)
)
})
output$plot <- renderPlot({
hist(rnorm(req(input$n), req(input$mean), req(input$sd)),
main = "Such wow",
xlab = "Wonderful x values",
ylab = "Incredible frequencies")
})
observe({
updateNumericInput(session, "mean_modal", value = input$mean)
updateNumericInput(session, "sd_modal", value = input$sd)
})
}
shinyApp(ui, server)