问题描述
我正在 Shiny 上做一个项目,其中有几个下拉菜单。菜单中包含的选项存储在数据框中,在运行应用程序时,您可以选择向数据框中添加更多数据。我预期的行为是下拉菜单中的选项会随着数据框的变化自动更新,但这不会发生。
这可以在 Shiny 中完成吗?如果是,如何?
/**
* {@inheritdoc}
*/
public function toResponse($request)
{
return JsonResource::toResponse($request);
}
解决方法
这里有几个问题。
- 第二个
selectInput
依赖于第一个,因此您还需要更新它以显示更新后的数据框。 - 最好创建一个
reactiveValues
对象作为要更新的数据框。 - 每当第一个更新时,您都需要一个
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)