user3463225 user3463225 - 1 month ago 8
jQuery Question

R shiny - save chosen values in selectInput

I have 10 'Edit' actionButtons. On each 'Edit' action buttons appears three selectInputs. After I click on 'Save' button below selectInputs, I want to remember selected values. If i go to row 2 -> click 'Edit' -> select values -> click 'Save' and go back to row 1, it does not remember previously selected values in row 1.

So I want to have two actions on 'Save' button namely:


  • store selected values for given 'Row' (so when i click again on the same Edit button I will see previously selected values)

  • make all selectInputs disapear after i click on save button

    library(shiny)

    ui <- shinyUI(fluidPage(

    titlePanel("Update Select Inputs"),

    mainPanel(
    tags$head(tags$script(HTML("$(document).on('click', '.needed', function () {
    Shiny.onInputChange('last_btn',this.id);
    });"))),
    column(width = 6,
    uiOutput('ValuesAndButtons')),
    column(width = 6,uiOutput('Details'))
    )
    )
    )

    server <- shinyServer(function(input, output) {

    output$ValuesAndButtons <- renderUI({

    lapply(
    c(1:10),
    function(i){
    fluidRow(
    column(
    width = 4,
    tags$span(i)
    ),
    column(
    width = 3,
    tags$button(
    type = "button",
    id = paste0('ActionButton', i),
    class="btn action-button needed",
    "Edit"
    )
    )
    )
    }
    )
    })

    output$Details <- renderUI ({

    req(input$last_btn)

    fluidRow(
    lapply(
    c(1:3),
    function(i){
    fluidRow(
    fluidRow(
    column(
    width = 5,
    tags$span(i)
    ),

    column(
    width = 5,
    selectInput(
    paste0("Details", i),
    label = NULL,
    choices = c("","a","b","c"),
    selected = ""

    )
    )
    )
    )

    }),
    fluidRow(
    tags$button(
    type = "button",
    id = "Save",
    class = "btn action-button",
    href = "#",
    "Save"
    )
    )
    )
    })

    })

    # Run the application
    shinyApp(ui = ui, server = server)


Answer

you can do it by storing values into reactivevValues values stored onlyfor one session

library(shinyjs) # needed for hide and show
ui <- shinyUI(fluidPage(

  titlePanel("Update Select Inputs"),

  mainPanel(
    useShinyjs(),
    tags$head(tags$script(HTML("$(document).on('click', '.needed', function () {
                               Shiny.onInputChange('last_btn',this.id);
                               });"))),
        column(width = 6,
               uiOutput('ValuesAndButtons')),
    column(width = 6,hidden(wellPanel(id="det",
                                      lapply(1:3,function(i){
                                        fluidRow(
                                          selectInput(
                                            paste0("Details", i), 
                                            label = i, 
                                            choices = c("","a","b","c"),
                                            selected = ""

                                          )
                                        )

                                      }),
                                      fluidRow(
                                        actionButton("Save","Save")
                                      )
    ))
    ))
  )
)

server <- shinyServer(function(input, output,session) {
  saved_values=reactiveValues(data=NULL)

  output$ValuesAndButtons <- renderUI({

    lapply(1:10,function(i){
      fluidRow(
        column(
          width = 4,
          tags$span(i)
        ),
        column(
          width = 3,
          actionButton(paste0('ActionButton', i),"Edit",class="needed"  )
        )
      )
    }
    )
  })
  observe({
    if(!is.null(input$last_btn)){
      observeEvent(input[[input$last_btn]],{
        shinyjs::show("det")
      }
                   )

    }

  })
  observeEvent(input$last_btn,{

    ll<-saved_values[[input$last_btn]]
    shinyjs::show("det")

    if(!is.null(ll) ){

      for(i in 1:length(ll)){
        updateSelectInput(session = session,inputId = names(ll)[[i]],selected = ll[[i]])

      }
    }else{
      shinyjs::reset("det")
    }

  })


  observeEvent(input$Save,{

    saved_values[[input$last_btn]]=lapply(names(input)[which(substring(names(input),1,7)=="Details")],function(i){
      input[[ i]]
    })
    names(saved_values[[input$last_btn]])=names(input)[which(substring(names(input),1,7)=="Details")]
    shinyjs::hide("det")
  })


})

# Run the application 
shinyApp(ui = ui, server = server)