【问题标题】:Dynamic image output based on user input shiny R基于用户输入的动态图像输出闪亮 R
【发布时间】:2017-01-12 18:46:56
【问题描述】:

我有一个 csv 文件,要上传到闪亮的应用程序中。除其他信息外,csv 文件包含一列名称(输入)和一列与每个名称关联的唯一 ID。基本上我想要发生的是每次用户选择不同的名称时,应用程序都会采用相应的 ID 并将其插入 URL 以将 PNG 图像显示为输出。例如,假设用户选择名称“Joe Smith”,Joe 的唯一 ID 是“smithj01”。我需要应用程序将“smithj01”插入到一个 URL 中,否则该 URL 总是相同的,然后显示 Joe 的图像。如果用户然后选择“John Doe”并且 John 的唯一 ID 是“doej01”,我需要应用程序将“doej01”插入到相同的 URL 中以显示 John 的图像。

我已经尝试在下面的代码中编写一个函数来执行此操作,但它仍然只显示一个带有问号的蓝色框,其中应该显示图像。

我一次又一次地尝试自己解决这个问题,查看了许多其他帖子和示例代码,但我一生都无法解决这个问题。请帮忙!非常感谢!

library(shiny)

injury <- read.csv("injury_app.csv", stringsAsFactors = FALSE)

"player_id" = "ID"

player_photo_url = function(player_id) {
  paste0("http://ssref.net/scripts/image_resize.cgi?min=200&url=https://d2cwpp38twqe55.cloudfront.net/req/201612101/images/players/", player_id,".png")
}

ui <- fluidPage(
  titlePanel("Title Goes Here"),
  sidebarLayout(
    sidebarPanel(
      selectInput("Player", "Player",
                  choices = c("Enter a player..." = "", injury$Player))
    ),
    mainPanel(
      uiOutput("image")
    )
  )
)

server <- function(input, output) {
  current_player = reactive({
    req(input$Player)
  })
  output$image <- renderUI({tags$img(src = player_photo_url(current_player()["player_id"]))
  })
}

shinyApp(ui = ui, server = server)

【问题讨论】:

  • https://d2cwpp38twqe55.cloudfront.net/req/201612101/images/players/doej01.png 返回 HTTP 错误 404
  • HubertL,感谢您的回复!这只是我给出的一个假设示例。例如,真实 ID 是“jamesle01”
  • 请包含您的 csv 标题
  • csv 的标题包括“Player”“ID”“Age”“Season”等。对于这个特定示例,我只关心列标题“Player”和“ID”

标签: r image csv shiny reactive-programming


【解决方案1】:

您遇到了一些奇怪的事情,但最令人担忧的事情似乎是您尝试为所选玩家名称选择 ID。假设将 csv injury 作为数据框读入,这应该可以工作:

library(shiny)

injury <- read.csv("injury_app.csv", stringsAsFactors = FALSE)
uniq_players <- sort(unique(injury$Player))

ui <- fluidPage(
  titlePanel("Title Goes Here"),
  sidebarLayout(
    sidebarPanel(
      selectInput("Player", "Player",
                  choices = c("Enter a player..." = "", uniq_players))
    ),
    mainPanel(
      uiOutput("image")
    )
  )
)

server <- function(input, output) {

  c_id <- reactive({
    shiny::validate(
      shiny::need(input$Player, "Select a player!")
    )
    injury[injury$Player == input$Player, "ID"]
  })

  c_url <- reactive({
    paste0("http://ssref.net/scripts/image_resize.cgi?min=200&url=https://d2cwpp38twqe55.cloudfront.net/req/201612101/images/players/", c_id(), ".png")
  })

  output$image <- renderUI({
    tags$img(src = c_url())
  })
}

shinyApp(ui = ui, server = server)

【讨论】:

  • 你好,mlegge!感谢您的回复。现在,当我尝试选择播放器时,它似乎给了我“错误:找不到对象'播放器'”。有没有办法解决这个问题?
  • 在处理数据帧而不是 data.table 时,我忘记了 injury[Player == input$Player, "ID"] 必须是 injury[injury$Player == input$Player, "ID"]。我已经在代码中进行了调整
猜你喜欢
  • 2015-05-06
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多