使用 actionButton 时,之前的 selectizeInput 值保留在选项顶部

问题描述 投票:0回答:1

下面的应用程序在启动时和首次单击

"Next Vehicle >" actionButton
时按预期工作。

当我第二次按下操作按钮时,它会按预期选择第三辆车,但是当我打开下拉列表时,先前选择的值“Cadillac Fleetwod”会首先列出,而我希望它会列在第二位。

Second click of actionButton

如果我第三次按下操作按钮,则会正确选择“Chrysler Imperial”,但现在“Camaro Z28”列在第一位,而我原本希望它列在第三位。请注意,如果忽略第一个值,“Cadillac Fleetwood”和“AMC Javelin”是正确的。

Third click of actionButton

如果我完全避免使用操作按钮,而是每次都手动单击,则下拉菜单中的顺序将符合预期。

每次使用操作按钮时,

input$vehicle
中的先前值都会首先列出。如何防止这种情况发生,并在使用该按钮时让我对
input$vehicle
的选择按字母顺序列出,而不管之前的值如何?

library(shiny)

df <- mtcars
df$vehicle <- rownames(df)
df <- df[order(df$vehicle), c("vehicle", colnames(mtcars))]

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectizeInput("vehicle",
                     "Select vehicle",
                     choices=NULL,
                     selected=NULL),
    ),
    mainPanel(
      actionButton("nextbut", "Next Vehicle >") ,
    )
  )
)

server <- function(input, output, session) {
  observe({
      updateSelectizeInput(session,
                           "vehicle",
                           "Select vehicle",
                           df$vehicle,
                           selected=df$vehicle[1],
                           server = T) 
  })
  
  observeEvent(input$nextbut, {
    vehicles <- df$vehicle
    idx <- which(vehicles == input$vehicle)
    if(idx != length(vehicles)){
      updateSelectizeInput(session,
                           "vehicle",
                           label = "Select vehicle",
                           choices = vehicles,
                           vehicles[idx+1],
                           server=T
      )
    }
  })
}

# Run the application 
shinyApp(ui = ui, server = server)
r shiny selectinput
1个回答
0
投票

在用户界面而不是服务器中设置选项可以解决此问题。 server = T 的 updateInputs 正在更改您的输入顺序。

library(shiny)

df <- mtcars
df$vehicle <- rownames(df)
df <- df[order(df$vehicle), c("vehicle", colnames(mtcars))]

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectizeInput("vehicle",
                     "Select vehicle",
                     choices=df$vehicle,
                     selected=NULL),
    ),
    mainPanel(
      actionButton("nextbut", "Next Vehicle >") ,
    )
  )
)

server <- function(input, output, session) {
  observe({
    updateSelectizeInput(session,
                         "vehicle",
                         "Select vehicle",
                         selected=df$vehicle[1]) 
  })
  
  observeEvent(input$nextbut, {
    vehicles <- df$vehicle
    idx <- which(vehicles == input$vehicle)
    if(idx != length(vehicles)){
      updateSelectizeInput(session,
                           "vehicle",
                           label = "Select vehicle",
                           selected = vehicles[idx+1]
      )
    }
  })
}

# Run the application 
shinyApp(ui = ui, server = server)
© www.soinside.com 2019 - 2024. All rights reserved.