用闪亮的新信息更新下拉列表

问题描述

我正在 Shiny 上做一个项目,其中有几个下拉菜单菜单中包含的选项存储在数据框中,在运行应用程序时,您可以选择向数据框中添加更多数据。我预期的行为是下拉菜单中的选项会随着数据框的变化自动更新,但这不会发生。

这可以在 Shiny 中完成吗?如果是,如何?

这是一个代码,其中包含我的工作方式示例。

/**
 * {@inheritdoc}
 */
public function toResponse($request)
{
    return JsonResource::toResponse($request);
}

解决方法

这里有几个问题。

  1. 第二个 selectInput 依赖于第一个,因此您还需要更新它以显示更新后的数据框。
  2. 最好创建一个 reactiveValues 对象作为要更新的数据框。
  3. 每当第一个更新时,您都需要一个 observeEvent 来更新第二个 selectInput

最后,只有在单击第二个选项卡上的 actionButton 时才会更新数据框 - 以避免在键入长文本时更新数据框。

试试这个

ui <- dashboardPage(skin = "red",dashboardHeader(title = "Marca de carros"),dashboardSidebar(sidebarMenu(
                      menuItem("Geral",tabName = "geral"),menuItem("Adicionar",tabName = "add")
                    )),dashboardBody(tabItems(
                      tabItem(tabName = "geral",p("Lista de marcas e modelos",style = "font-size:20px"),selectInput("marca","Marca",c("",carros$MARCA)),selectInput("modelo","Modelo",carros$MODELO)),actionButton("envio","Enviar",class = 'btn-primary')),tabItem(tabName = "add",p("Adicionar novas marcas e modelos",textInput("marcanova","Marca"),textInput("modelonovo","Modelo"),actionButton("cadastro",class = 'btn-primary'),DTOutput("t1")
                              )
                    ))
)



server <- function(input,output,session){
  rv <- reactiveValues(carros=carros)
  #menu condicional
  var2.choice <- eventReactive(input$marca,{
    req(input$marca)
    rv$carros %>%
      filter(MARCA == input$marca) %>%
      pull(MODELO)
  })
  observe({
    updateSelectInput(session,"marca",choices = unique(rv$carros[,1]))
  })
  observeEvent(input$marca,{
    updateSelectInput(session,"modelo",choices = var2.choice()) # unique(rv$carros[rv$carros[,1] == input$marca,2]))
  })
  #fim do menu condicional
  
  # add notificacao de enviado
  observeEvent(input$envio,{
    showNotification("Enviado")
  })
  # fim da notificacao
  
  # add notificacao de cadastrado
  observeEvent(input$cadastro,{
    showNotification("Cadastrado")
  })
  # fim da notificacao
  
  newdf <- eventReactive(input$cadastro,{
    req(input$marcanova,input$modelonovo)
    df <- rbind(rv$carros,data.frame(MARCA=as.character(input$marcanova),MODELO = as.character(input$modelonovo)))
  })
  
  ## juntando as informacoes
  observe({
    req(input$marcanova,input$modelonovo,newdf())
    rv$carros <- newdf()
  })
  
  output$t1 <- renderDT({rv$carros})
}

shinyApp(ui,server)