基于单选按钮更新 pickerInput

Updating pickerInput based on radiobutton

我希望能够根据单选按钮输入中的选择更新 pickerInput 中可用的选择。在下面的示例中,我希望单选按钮“A”提供 mtcars$cyl 的 pickerInput 列表,而“B”的选择器输入提供 mtcars$mpg

的选择器输入

我已经尝试使用 if 语句来执行此操作,但到目前为止我还没有任何进展。下面的可重现示例:

   library(shiny)
library(leaflet)
library(shinyjs)
library(rgeos)
library(tidyverse)
library(openxlsx)
library(plotly)
library(shinyWidgets)
library(rgdal)




ui <- fluidPage(shinyjs::useShinyjs(), 

fluidRow(column(
6,radioButtons("type", "Type:",
c("A" = "norm",
"B" = "unif")))),

fluidRow(column(
3,
pickerInput("regInput","Region",choices=unique(mtcars$cyl), 
  options = list(`actions-box` = TRUE),multiple = T,
selected = unique(mtcars$cyl)))))


server <- function (input, output, session) {


observeEvent(input$type,{
  a_option <- input$regInput
  if (a_option == "B") {
updatePickerInput(session = session,inputId = "regInput",
choices  =unique(mtcars$mpg))}})


}

shinyApp(ui = ui, server = server)

服务器必须监听正确的 UI 元素(ID =“类型”用于相关单选按钮)。目前它观察到一个未定义的元素“dist”。

尝试改变

observeEvent(input$dist, { code })

observeEvent(input$type, { code })

如另一个答案所述,您需要观察 input$type 并根据其中的值更新选择器输入。此外,包含 else 语句也很重要,以便能够在用户多次在单选按钮选项之间进行选择时更新选择器输入。最后,在 updatePickerInput 上,您需要包含所选参数以保持在 ui.

上的行为

下面是执行我上面描述的代码:

library(shiny)
library(shinyjs)
library(tidyverse)
library(shinyWidgets)

ui <- fluidPage(shinyjs::useShinyjs(), 
                
                fluidRow(
                  column(
                    6,
                    radioButtons("type",
                                 "Type:",
                                 c("A" = "norm",
                                   "B" = "unif"))
                  )),
                
                fluidRow(
                  column(
                    3,
                    pickerInput("regInput","Region",
                                choices=unique(mtcars$cyl), 
                                options = list(`actions-box` = TRUE),
                                multiple = T,
                                selected = unique(mtcars$cyl))
                  ))
)


server <- function (input, output, session) {
  
  observeEvent(input$type,{
    if (input$type == "unif") {
      updatePickerInput(session = session,inputId = "regInput",
                        choices = unique(mtcars$mpg),
                        selected = unique(mtcars$mpg))
    } else {
      updatePickerInput(session = session,inputId = "regInput",
                        choices = unique(mtcars$cyl),
                        selected = unique(mtcars$cyl))
    }
  })
  
  
}

shinyApp(ui = ui, server = server)