【问题标题】:Update multiple dependent inputs更新多个依赖输入
【发布时间】:2018-11-07 07:36:57
【问题描述】:

我有许多相关的输入字段,并希望在用户单击按钮时更新所有这些字段。用例是加载存储的输入设置。下面是一个可重现的例子。 “花瓣”选择输入的选择取决于“物种”选择输入中的选择。

当我点击按钮时,只有第一个 selectInput 被更新。

library(shiny)

data(iris)

# ui function
ui <- fluidPage(
  uiOutput("species.out"),
  uiOutput("petal.out"), 
  actionButton("update", label = "Update")
)

# server function
server <- function(input, output, session) {

  output$species.out = renderUI({
    selectInput("species", label = "", choices = sort(unique(iris$Species)))
  })

  output$petal.out = renderUI({

    req(input$species)

    selectInput("petal", label = "", choices = sort(unique(iris[iris$Species == input$species,]$Petal.Width)))
  })

  observeEvent(input$update,
               {
                 updateSelectInput(session, inputId = "species", selected = "virginica")
                 updateSelectInput(session, inputId = "petal", choices=sort(unique(iris[iris$Species == input$species,]$Petal.Width)), selected = "2.3")
               })

}

shinyApp(ui = ui, server = server)

有没有办法同时更新两个字段?

【问题讨论】:

    标签: shiny


    【解决方案1】:

    一种方法是为input$species 添加另一个observeEvent,您将在其中更新selectInput 花瓣。以下是修改后的代码:

    library(shiny)
    
    data(iris)
    
    # ui function
    ui <- fluidPage(
      uiOutput("species.out"),
      uiOutput("petal.out"), 
      actionButton("update", label = "Update")
    )
    
    # server function
    server <- function(input, output, session) {
    
      output$species.out = renderUI({
        selectInput("species", label = "", choices = sort(unique(iris$Species)))
      })
    
      output$petal.out = renderUI({
    
        req(input$species)
    
        selectInput("petal", label = "", choices = sort(unique(iris[iris$Species == input$species,]$Petal.Width)))
      })
    
      observeEvent(input$update,
                   {
                     updateSelectInput(session, inputId = "species", selected = "virginica")
                     # updateSelectInput(session, inputId = "petal", choices=sort(unique(iris[iris$Species == input$species,]$Petal.Width)), selected = "2.3")
                   })
    
    
      observeEvent(input$species,{
        req(input$petal)
        updateSelectInput(session, inputId = "petal", choices=sort(unique(iris[iris$Species == input$species,]$Petal.Width)), selected = "2.3")
      } )
    
    }
    
    shinyApp(ui = ui, server = server)
    

    希望对你有帮助!

    编辑:

    要更新input$petal,即使input$species 不是以下代码也可以:

    library(shiny)
    
    data(iris)
    
    # ui function
    ui <- fluidPage(
      uiOutput("species.out"),
      uiOutput("petal.out"), 
      actionButton("update", label = "Update")
    )
    
    # server function
    server <- function(input, output, session) {
    
      output$species.out = renderUI({
        selectInput("species", label = "", choices = sort(unique(iris$Species)))
      })
    
      output$petal.out = renderUI({
    
        req(input$species)
    
        selectInput("petal", label = "", choices = sort(unique(iris[iris$Species == input$species,]$Petal.Width)))
      })
    
      observeEvent(input$update,
                   {
                     updateSelectInput(session, inputId = "species", selected = "virginica")
                     updateSelectInput(session, inputId = "petal", choices=sort(unique(iris[iris$Species == input$species,]$Petal.Width)), selected = "2.3")
                   })
    
    
      observeEvent(input$species,{
        if(input$petal == "" || req(input$petal))
        updateSelectInput(session, inputId = "petal", choices=sort(unique(iris[iris$Species == input$species,]$Petal.Width)), selected = "2.3")
      } )
    
    }
    
    shinyApp(ui = ui, server = server)
    

    这里我将条件req(input$petal)更改为if(input$petal == "" || req(input$petal)),并在input$updateobserveEvent中添加了updateSelectInput(session, inputId = "petal", choices=sort(unique(iris[iris$Species == input$species,]$Petal.Width)), selected = "2.3")

    【讨论】:

    • 感谢您的提议。如果物种已经被选择为“virginica”,那么该解决方案不起作用,但花瓣不是“2.3”。在这种情况下,observeEvent(input$species",..) 不会触发。
    • @WarrenBuffet 看看编辑后的答案,它解决了您的问题。
    • 更新的代码崩溃了,我在选择一个物种时收到以下错误:Warning: Error in ||: invalid 'y' type in 'x || y'。另外,如果代码有效,它不会在每次用户更改物种时尝试将存储的值加载到input$petal,而不仅仅是当用户点击Update时?
    • 哦,我没注意到。那么最简单的方法是将原始代码中的updateSelectInput(session, inputId = "petal", choices=sort(unique(iris[iris$Species == input$species,]$Petal.Width)), selected = "2.3") 更改为updateSelectInput(session, inputId = "petal", choices=sort(unique(iris[iris$Species == "virginica",]$Petal.Width)), selected = "2.3")
    • 不幸的是,这通常不起作用。 :( 如果选择的物种不是“virginica”,那么花瓣 selectInput 不会更新。这意味着用户必须点击两次Update
    猜你喜欢
    • 2016-06-12
    • 1970-01-01
    • 2013-08-08
    • 2020-01-02
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2018-07-04
    相关资源
    最近更新 更多