【问题标题】:Conditionally rendering gifs on shiny有条件地在闪亮上渲染 gif
【发布时间】:2019-12-12 10:49:23
【问题描述】:

我想根据用户的选择在闪亮上呈现 gif。例如,如果用户选择了一个给定的战斗机,如果我保存了一个带有与该选择关联的 id 的 gif,则一个 gif 将呈现在 Web 应用程序的底部。

这是我的代码:

   #select player name
   uiOutput("Names")
   #render gif
   imageOutput("gifs")
   #in server function
     output$Names <- renderUI({
       req(input$dropdown)
       df <- boxing %>% filter(division %in% input$dropdown)
       selectInput("names","Player A",choices = df$name)
     })
   #render gif from server
   output$gifs <- renderImage({
       tags$video(src=paste(boxing[boxing$name == input$names, "global_id"],".gif",sep="",type="video/gif"), width=100)
     })

这是我的数据示例

   name      global_id
   Fox         121
   Jim         122
   Felix       123
   Joel        124
   Paul        125

这些是我的 www 导演中的 gif 图像

123.gif
124.gif

如果不存在 gif,我不想为该特定玩家显示任何内容。

这是我目前收到的错误消息

Error: invalid filename argument

【问题讨论】:

  • 我无法测试它,但我相信错误在您的paste() 中。考虑使用 switch-case 来引用 gif。
  • @mhh 最初是这样,但现在当我在控制台上打印 paste() 语句时,我得到了文件名,但无法呈现 gif。我还将文件名作为应用程序的输出
  • 更正paste()后是否出现同样的错误?
  • @mhh 不,我只是得到文件名

标签: r shiny


【解决方案1】:

我相信错误出在您的paste() 中。试试这个:

output$gifs <- renderImage({
  tags$video(src=paste(boxing[boxing$name == input$names, "global_id"],".gif",sep=""),type="video/gif", width=100)
})

虽然您的代码可以正常工作,但您也可以考虑使用 switch-case。但是,如果您有很多字符/gif,这将是混乱的。例如:

output$gifs <- renderImage({
  this_gif <- switch (input$names,
    "Fox" = 121,
    "Jim" = 122
    # Etc
  )
  tags$video(src=paste(this_gif,".gif", sep = ""),type="video/gif", width=100)
})

【讨论】:

  • 这个解决方案不可扩展,在我的书中,可以改进。也许使用grepl 或其他一些正则表达式解决方案。
  • 感谢您的建议 - 您能否详细说明如何使其更具可扩展性?另一种选择是在global_id 中完整引用文件名。 Switch case 还具有defaultaction 的好处,因为 OP 希望有一个选项,如果未选择任何内容,则什么也不做。
  • 我将构造一个正则表达式有效字符串来获取确切的文件名并在即grepl 中使用它。另一个选项是有一个名称、文件名和 id 的查找表,然后按 id 匹配以确保明确性。
猜你喜欢
  • 2016-12-29
  • 1970-01-01
  • 2018-01-14
  • 2015-01-11
  • 2016-06-12
  • 2018-08-05
  • 2017-09-30
  • 2018-06-30
  • 2014-11-26
相关资源
最近更新 更多