【问题标题】:How to have items in selectInput use a common numericInput?如何让 selectInput 中的项目使用通用的 numericInput?
【发布时间】:2020-07-01 03:56:41
【问题描述】:

示例脚本:

library(shiny)

ui <- fluidPage(
    selectInput("Select1","Name", c("Jack", "Daisy", "Mason")),
    numericInput("num_balls", "Number of Balls", value = NA, step = 1))

server <- function(input, output,session) {
    observeEvent(input$Select1,{
        updateNumericInput(session, 'num_balls', label = "Number of Balls", value = NA, step = 1)
    }) 
}

shinyApp(ui = ui, server = server)

我有一个带有三个名称的 selectInput - 我希望它们共享一个通用的 numericInput 框,并且每个选项的值都不同,例如Jack 得到 3 个球,Daisy 得到 4 个球,Mason 得到 5 个,但是我不知道正确的语法是什么。我希望能够在服务器脚本的其他假设部分中使用我为 Select1 中的每个选项提供的值。

在搜索“相关输入”作为我的搜索表达式时,我尝试借用语法来解决类似问题,例如 here,它建议使用某种形式的 observe_ 或通过在服务器脚本中创建 UI renderUI() 但我仍然不确定创建可以从另一个输入提供多个选项的 numericInput 的最佳方法。正如您在示例中看到的那样,当我尝试为一个人分配一个号码时,比如说 Jack,然后去 Daisy 或 Mason,然后再回到 Jack,我输入的数字消失了。我知道这是因为updateNumericInput() 中的值总是分配给NA。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    您可以将球的值存储为反应值,然后使用选定的名称 input$Select1 访问这些值。要正确存储球的数量,您需要第二个观察者来存储更改时的值:

    library(shiny)
    
    ui <- fluidPage(
      selectInput("Select1","Name", c("Jack", "Daisy", "Mason")),
      numericInput("num_balls", "Number of Balls", value = NA, step = 1))
    
    server <- function(input, output,session) {
      number_of_balls <- reactiveValues()
      number_of_balls[["Jack"]] <- NA
      number_of_balls[["Daisy"]] <- NA
      number_of_balls[["Mason"]] <- NA
      
      observeEvent(input$num_balls, {
        number_of_balls[[input$Select1]] <- input$num_balls
      })
      observeEvent(input$Select1,{
        updateNumericInput(session, 'num_balls',
                           label = "Number of Balls",
                           value = number_of_balls[[input$Select1]], step = 1)
      }) 
    }
    
    shinyApp(ui = ui, server = server)
    

    注意:您需要使用NA 初始化反应值,否则当尚未选择任何名称时,第一个选择的值将显示为其他名称的默认值。

    【讨论】:

      【解决方案2】:

      您可以对 selectInput 进行更改,导致 numericInput 像这样更新。

      library(shiny)
      
      ui <- fluidPage(
        selectInput(inputId = "Select1",
                    label = "Name",
                    choices = c("Jack", "Daisy", "Mason"),
                    selected = "Jack"),
        numericInput("num_balls", "Number of Balls", value = NA, step = 1))
      
      server <- function(input, output,session) {
        observeEvent(input$Select1,{
          
          if(input$Select1 == "Jack") {
            updateNumericInput(session, 'num_balls', label = "Number of Balls", value = 3, step = 1)  
          } else if(input$Select1 == "Daisy") {
            updateNumericInput(session, 'num_balls', label = "Number of Balls", value = 4, step = 1)  
          }  else if(input$Select1 == "Mason") {
            updateNumericInput(session, 'num_balls', label = "Number of Balls", value = 5, step = 1)  
          }
        }) 
      }
      
      shinyApp(ui = ui, server = server)
      

      但是,如果用户直接使用数字输入框,仍然可以将数字输入修改为其他值。

      【讨论】:

        猜你喜欢
        • 2020-08-11
        • 2019-12-10
        • 1970-01-01
        • 2021-06-13
        • 2021-04-22
        • 1970-01-01
        • 1970-01-01
        • 2019-02-13
        • 2019-02-15
        相关资源
        最近更新 更多