R闪亮 - 在selectInput

时间:2016-10-21 07:56:42

标签: jquery r shiny

我有10个'编辑'动作按钮。在每个“编辑”操作按钮上会出现三个selectInput。点击selectInputs下方的“保存”按钮后,我想记住选定的值。如果我去第2行 - >点击“修改” - >选择值 - >单击“保存”并返回第1行,它不记得先前在第1行中选择的值。

所以我希望在“保存”按钮上有两个动作,即:

  • 为给定的'Row'存储选定的值(所以当我再次点击同一个Edit按钮时,我会看到之前选择的值)
  • 单击保存按钮

    后,使所有selectInputs消失

    库(有光泽)

    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)
    

1 个答案:

答案 0 :(得分:1)

您可以将值存储到只存储一个reactivevValues

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)