更新多个依赖输入

Posted

技术标签:

【中文标题】更新多个依赖输入【英文标题】: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)

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

【问题讨论】:

【参考方案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

以上是关于更新多个依赖输入的主要内容,如果未能解决你的问题,请参考以下文章

Shiny Reactive renderUI 和多个依赖/耦合输入

Android控件状态依赖

在 vue 中以编程方式更新多个输入

如何使用 bootstrap-datepicker 更新多个输入

如何测试具有多个输入调用的循环?

如何使用shell触发多个依赖程序?