r语言 - 如何让选择输入中的项目使用通用的数字输入?



示例脚本:

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)

我有一个带有三个名称的选择输入 - 我希望他们共享一个通用的数字输入框,并且每个选项的值都不同,例如杰克得到 3 个球,黛西得到 4 个球,梅森得到 5 个球,但是我不知道正确的语法是什么。我希望能够在服务器脚本的其他假设部分中使用我为Select1的每个选项提供的值。

在搜索"依赖输入"作为我的搜索表达式时,我尝试借用语法来解决类似的问题,例如,建议使用某种形式的observe_或通过renderUI()在服务器脚本中创建 UI,但我仍然不确定创建数字输入的最佳方法,它可以从另一个输入提供多个选项。正如你在示例中所看到的,当我尝试为一个人分配一个数字时,比如杰克,然后转到黛西或梅森,然后回到杰克,我输入的数字消失了。我知道这是因为updateNumericInput()中的值总是分配给NA.

您可以将球的值存储为反应值,然后使用所选名称访问这些值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初始化反应值,否则当尚未选择任何内容时,第一个选定的值将显示为其他名称的默认值。

您可以对选择输入进行更改,使数字输入像这样更新。

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)

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

最新更新