Обновить несколько зависимых входов - PullRequest
0 голосов
/ 28 мая 2018

У меня есть несколько зависимых полей ввода, и я хотел бы обновить их все, когда пользователь нажимает кнопку.Вариант использования - загрузка сохраненных настроек ввода.Ниже приведен воспроизводимый пример.Выбор для «лепестка» selectInput зависит от выбора в «видов» selectInput.

Когда я нажимаю на кнопку, обновляется только первый 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 Ответ

0 голосов
/ 29 мая 2018

Один из способов сделать это - добавить observeEvent для input$species, где вы бы обновили лепесток 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)), а также добавил updateSelectInput(session, inputId = "petal", choices=sort(unique(iris[iris$Species == input$species,]$Petal.Width)), selected = "2.3") в observeEvent из input$update.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...