R Shiny:如何根据用户输入使 numericInput 动态初始值

R Shiny: How to make the initial value for numericInput dynamic, based on user input

我正在尝试根据用户的输入使 shiny::numericInput()value 参数动态化。

下面的两个代码块都会 运行,但它们无法设置动态初始值。

区块 1:

idOptions <- c("1","2","3")

ui <- shiny::fluidPage(
  shiny::selectInput(inputId = "idSelection", "Identification: ", idOptions),
  shiny::numericInput("num", "Number associated with id:", value=shiny::verbatimTextOutput("numberOut")),
)

server <- function(input, output) {
  df <- data.frame(id = c("1","2","3"), number = c(100,227,7))
  output$numberOut <- shiny::renderText({ input$idSelection })
}

shiny::shinyApp(ui, server)

区块 2:

idOptions <- c("1","2","3")

ui <- shiny::fluidPage(
  shiny::selectInput(inputId = "idSelection", "Identification: ", idOptions),
  shiny::numericInput("num", "Number associated with id:", value=shiny::verbatimTextOutput("numberOut")),
)

server <- function(input, output) {
  df <- data.frame(id = c("1","2","3"), number = c(100,227,7))
  dfReactive <- shiny::reactive({
    dataOut <- df %>%
      dplyr::filter(., id %in% input$idSelection)
    return(dataOut)
  })
  shiny::observe({
    output$numberOut <- shiny::renderText({ 
      return(dfReactive()$number)
    })
  })
}

shiny::shinyApp(ui, server)

我希望 shiny::numericInput 的初始值改变如下:

当用户为Identification选择“1”时,初始值为100:

当用户为Identification选择“2”时,初始值为227:

这背后的想法是根据输入的标识向用户建议适当的初始值。

我猜问题可能出在 shiny::verbatimTextOutput("numberOut"),但我不知道如何呈现一个简单的数值以传递给 shiny::numericInputvalue 参数.

有什么想法吗?

非常感谢。

一种方法是使用 renderUI 并在服务器端进行计算:

idOptions <- c("1","2","3")

shiny::shinyApp(

  ui = shiny::fluidPage(
    shiny::selectInput(inputId = "idSelection", "Identification: ", idOptions),
    shiny::uiOutput("num")
  ),
  
  server = function(input, output) {
    
    df <- data.frame(id = c("1","2","3"), number = c(100,227,7))
    
    output$num <- shiny::renderUI({
      shiny::numericInput("num",
                          "Number associated with id:",
                          value = df$number[as.numeric(input$idSelection)])
    })
    
})

另一种方法是将输入留在 UI 端,并在 observeEvent:

中使用 updateNumericInput
idOptions <- c("1","2","3")

shiny::shinyApp(
  
  ui = shiny::fluidPage(
    
    shiny::selectInput(inputId = "idSelection",
                       "Identification: ",
                       idOptions),
    
    shiny::numericInput("num",
                        "Number associated with id:",
                        value = NULL)
  ),
  
  server = function(input, output, session) {
    
    df <- data.frame(id = c("1","2","3"),
                     number = c(100,227,7))
    
    observeEvent(input$idSelection, {
      updateNumericInput(session,
                         inputId = "num",
                         value = df$number[as.numeric(input$idSelection)])
    })
  })