闪亮:基于搜索栏的 pickerInput 选择

shiny: pickerIntput choices based on search bar

嗨,我正在尝试让我的 pickerInput 中的 'choices' 取决于用户在上面的搜索栏中键入的内容。我使用的是 spotify r 包,如果您搜索某个艺术家 api returns 一个 table 相似名字的艺术家,您需要选择您想要的艺术家。无论如何,我希望 table 进入 pickerInput,但我似乎无法让它工作。

    ui <- dashboardPage(skin = "green",
  dashboardHeader(title = "Lyric Prediction"),

  dashboardSidebar(
    sidebarMenu(
      menuItem("Overview", tabName = "Overview", icon = icon("search")),
      menuItem("Analysis", tabName = "Analysis", icon = icon("bar-chart-o"))
    )
  ),
  dashboardBody(
    tags$head( 
      tags$style(HTML(".fa { font-size: 18px; }"))
    ),
    tabItems(
      # First tab content
      tabItem(tabName = "Overview",
          fluidRow(
            column(12,
              searchInput(
                inputId = "search", label = "Search Artist on Spotify",
                placeholder = "Search",
                btnSearch = icon("search"),
                btnReset = icon("remove"),
                width = "500px"
              )
            ), align = "center"  
            ),

          #HERE - how can i have pickerInput take in the output 
          #of "res" from the server? 


          fluidRow(pickerInput(choices = "res")
          )),
  )
)


server <- function(input, output) {

  #function to take search input 
  #output list of possible artists 
  output$res <- renderTable({         
         #Rspotify
         possibleArtists <- searchArtist(input$search,token=my_oauth)
         possibleArtists <-  as_tibble(possibleArtists)
         myCols <- c("display_name","id")
         colNums <- match(myCols,names(possibleArtists))
         possibleArtists <- possibleArtists %>%
           select(colNums)
         possibleArtists
  })

}

shinyApp(ui, server)

observeEvent 中使用 update 方法,如下所示:

observeEvent(input$search, {
  #Rspotify
  possibleArtists <- searchArtist(input$search,token=my_oauth)
  possibleArtists <-  as_tibble(possibleArtists)
  myCols <- c("display_name","id")
  colNums <- match(myCols,names(possibleArtists))
  possibleArtists <- possibleArtists %>%
    select(colNums)
  updatePickerInput(
    session = session,
    inputId = "picker",
    choices = possibleArtists
  )
}, ignoreInit = TRUE)

完整示例:

library(shiny)
library(shinydashboard)
library(shinyWidgets)

ui <- dashboardPage(
  skin = "green",

  dashboardHeader(title = "Lyric Prediction"),

  dashboardSidebar(
    sidebarMenu(
      menuItem("Overview", tabName = "Overview", icon = icon("search")),
      menuItem("Analysis", tabName = "Analysis", icon = icon("bar-chart-o"))
    )
  ),

  dashboardBody(
    tags$head( 
      tags$style(HTML(".fa { font-size: 18px; }"))
    ),
    tabItems(
      # First tab content
      tabItem(
        tabName = "Overview",
        fluidRow(
          column(12,
                 searchInput(
                   inputId = "search", label = "Search Artist on Spotify",
                   placeholder = "Search",
                   btnSearch = icon("search"),
                   btnReset = icon("remove"),
                   width = "500px"
                 )
          ), align = "center"  
        ),

        pickerInput(inputId = "picker", label = "Choose an artist:", choices = NULL)
      )
    )
  )
)


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

  observeEvent(input$search, {
    updatePickerInput(
      session = session,
      inputId = "picker",
      choices = c("The Beatles", 
                  "The Beatles Recovered Band", 
                  "Yesterday - A Tribute To The Beatles",
                  "The Beatles Revival Band & Orchestra")
    )
  }, ignoreInit = TRUE)

}

shinyApp(ui, server)