【问题标题】:R shiny - save chosen values in selectInputR 闪亮 - 在 selectInput 中保存选择的值
【发布时间】:2016-10-21 07:56:41
【问题描述】:

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

所以我想对“保存”按钮进行两个操作:

  • 存储给定“行”的选定值(因此,当我再次单击同一个编辑按钮时,我将看到以前选择的值)
  • 在我点击保存按钮后,让所有 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)
    

【问题讨论】:

  • 点击“保存”操作按钮后,我想更新所有选择输入中的选定值 - 它们应该在“保存”之前显示最后选择的值。基本上我有很多actionButtons(称为'mainButtonX'),上面显示了一些selectInputs和额外的'Save'按钮。当我单击 mainButtonX 并在 selectInputs 中选择一些值并单击另一个 mainButton 并再次返回时,我选择的值为 null - 它不会像我希望的那样动态更新或更新保存按钮。
  • 我更新了我的问题和代码。
  • 您想将值存储在某个地方还是简单地将其隐藏并显示?
  • 我想存储选定的值。

标签: jquery r shiny


【解决方案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)

【讨论】:

  • 中的错误:无法找到用于签名“字符”的函数“重置”的继承方法;当我添加 shinyjs::reset() 时,当我按下“编辑”按钮时没有任何显示
  • 尝试在shinyjs::reset 上进行更改,你有图书馆shinyjs 吗?
  • 你在 UI 中有 useShinyjs() 吗?
  • 在您回答之前更新了我的评论。我有,0.6版
  • 好的,现在它可以工作了——我必须重新启动 R。感谢战利品!保存后是否可以单击相同的编辑按钮?现在,当您单击“保存”(第 1 行)并想再次在第 1 行中按“编辑”时,什么都没有显示。
猜你喜欢
  • 2015-05-07
  • 2018-07-09
  • 2014-12-15
  • 2018-10-25
  • 2021-06-18
  • 2014-12-22
  • 1970-01-01
  • 2018-07-07
  • 2016-07-28
相关资源
最近更新 更多