You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shiny中实现pickerInput选项依赖搜索框输入的问题

没问题,我来帮你搞定这个动态更新pickerInput选项的需求!结合Spotify R包和Shiny的动态UI功能,完全能实现搜索艺术家后自动加载匹配选项的效果,具体方案和代码示例如下:

核心思路

要实现选项依赖搜索输入的功能,关键是利用Shiny的实时监听+动态更新机制:

  1. 用文本输入框接收用户的艺术家搜索词
  2. 监听输入变化,调用Spotify API获取匹配的艺术家数据
  3. 将返回的艺术家列表实时更新到pickerInput的选项中
完整代码示例

我把你的dashboard结构整合进去,加上动态逻辑:

library(shiny)
library(shinydashboard)
library(shinyWidgets) # 依赖pickerInput的包
library(spotifyr)

ui <- dashboardPage(
  skin = "green",
  dashboardHeader(title = "Lyric Prediction"),
  dashboardSidebar(
    sidebarMenu(
      menuItem("Overview", tabName = "overview", icon = icon("music"))
    )
  ),
  dashboardBody(
    tabItems(
      tabItem(tabName = "overview",
              # 艺术家搜索输入框
              textInput(inputId = "artist_search", 
                        label = "搜索艺术家", 
                        placeholder = "输入艺术家名字"),
              # 动态更新的pickerInput,初始为空
              pickerInput(inputId = "target_artist",
                          label = "选择目标艺术家",
                          choices = NULL,
                          options = list(`live-search` = TRUE)) # 自带搜索功能更方便
      )
    )
  )
)

server <- function(input, output, session) {
  
  # 先确保完成Spotify API授权(请替换成你的客户端ID和密钥)
  spotifyr::get_spotify_access_token(
    client_id = "你的Spotify客户端ID",
    client_secret = "你的Spotify客户端密钥"
  )
  
  # 监听搜索框输入,实时更新picker选项
  observeEvent(input$artist_search, {
    # 搜索框为空时清空选项
    if (input$artist_search == "") {
      updatePickerInput(session, "target_artist", choices = NULL)
      return()
    }
    
    # 调用API并处理结果
    tryCatch({
      # 搜索艺术家,返回前10个匹配结果
      search_res <- spotifyr::search_artists(input$artist_search, limit = 10)
      
      # 把结果转成picker需要的格式:名称显示给用户,ID作为后台值
      artist_choices <- setNames(search_res$id, search_res$name)
      
      # 更新picker选项
      updatePickerInput(session, "target_artist", 
                        choices = artist_choices,
                        selected = NULL)
    }, error = function(e) {
      # 处理API调用错误(比如无结果、网络问题)
      updatePickerInput(session, "target_artist", 
                        choices = c("未找到匹配艺术家" = ""))
      showNotification(paste("搜索出错:", e$message), type = "error")
    })
  })
  
  # 可选:监听选中的艺术家,做后续逻辑(比如获取歌词)
  observeEvent(input$target_artist, {
    if (!is.null(input$target_artist) && input$target_artist != "") {
      # 示例:获取选中艺术家的热门曲目
      # top_tracks <- spotifyr::get_artist_top_tracks(input$target_artist)
      # 这里可以加你的歌词预测逻辑...
    }
  })
}

shinyApp(ui, server)
关键细节说明
  • 授权配置:必须先完成Spotify开发者账号的注册,创建应用获取客户端ID和密钥,否则API调用会失败。
  • 选项格式:用setNames()把艺术家ID作为后台值,名称作为显示文本,后续调用其他API(比如获取歌词、专辑)时直接用ID更可靠。
  • 错误处理:用tryCatch包裹API调用,避免因为网络波动或无匹配结果导致App崩溃,同时给用户明确提示。
  • 体验优化:给pickerInput加上live-search选项,用户可以在匹配列表里再次搜索,找目标艺术家更高效。

内容的提问来源于stack exchange,提问作者helloworld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:52:52