更新多个依赖输入
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$update
的observeEvent
中添加了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 和多个依赖/耦合输入