【问题标题】:Display locally-stored image in R Shiny在 R Shiny 中显示本地存储的图像
【发布时间】:2020-12-29 10:36:53
【问题描述】:

我花了相当多的时间试图解决这个问题。 当然,在这里分享我的问题之前我已经做了功课。

特别是我没有成功咨询过:

  1. local image in shiny app without img(src())?
  2. Shiny can not display Image locally
  3. adding local image with html to a Shiny app
  4. R Shiny img() on UI side does not render the image
  5. Display images from web in shiny R
  6. Image failing to display in R shiny
  7. Embedding Image in Shiny App
  8. How to place an image in an R Shiny title

所以我确实在 RStudio 项目文件的根目录下创建了一个“www”文件夹,我在其中放置了一些图片。

这些图片在 titlePanel 中使用,但也被应用程序调用的主 htmlwidget 使用。

将这些图片存储在本地对我来说至关重要,因为该应用程序可能在安全的环境中运行而无需访问 Internet。

我尝试了这些图片的相对路径和绝对路径:没有显示图片。

然后我注意到某种不一致:只有当我通过 RStudio 中的常规命令“运行选定行”运行应用程序时才会遇到此问题。 另一方面,当我通过专用命令“运行应用程序”(在 RStudio 的右上角,绿色箭头)运行应用程序时,我不再有这个问题,图片显示很好(但输入数据是以某种方式进行了检查,并且在启动应用程序之前需要很长时间)。

最初我认为显示本地图像比使用存储在 Internet 上的远程图像要容易得多,但似乎恰恰相反。

因此我的问题是:

  1. 您知道为什么我们可以观察到这种差异(这对我来说是不一致的)吗?
  2. 您知道我怎样才能继续使用常规执行命令(“运行选定的行”)吗?

最好的问候,

奥利维尔

【问题讨论】:

  • 你能分享一个可重现的例子吗?没有代码很难提供帮助。

标签: r image shiny local display


【解决方案1】:

我没有具体的答案,但 Hadley 在“掌握闪亮”一书中的“图形”一章下展示了如何显示本地存储的图像的示例。这本书正在开发中,应该很快就会发布,我将粘贴该章节的链接:

Graphics chapter

示例位于图像部分。

HTH

【讨论】:

    【解决方案2】:

    管理目录可能很棘手。

    您可以使用here 包使处理R 项目中的目录变得更加容易,请参阅Ode to the here package

    打开项目后,www 中的图片可以很容易地被访问:

    here::here('www/myimage.jpg')
    

    这也适用于采购应用程序或脚本。

    【讨论】:

    • 感谢@Waldi,您的回答和建议。我认为包here 是没用的,特别是因为我使用RStudio 项目文件(正如我在我的问题中提到的,也正如你所建议的那样),所以我已经在使用应用程序中的相对路径。但我认为问题出在其他地方:我认为结果不应取决于您启动应用程序的方式 - 通过“运行选定行”命令或通过专用命令“运行应用程序”进行“常规”。跨度>
    • @Olivier7121,你是对的,你已经提到你使用项目!当您从交互式会话(运行几行)切换到源/运行脚本模式时,我发现here 在项目中的这些情况下特别有用。你试一试了吗?太有用了,我什至不认为它是否真的有用......,几个额外的字符让我相信它会按预期工作。但在某些情况下它可能真的没用。
    • 是的,我确实尝试过here,这就是我发现它没用的原因。假设它还没有找到这个包的合适用途......我使用的几个额外字符只是file.path(".", "SomeSubFolder")
    • 这是我的完整推理 w.r.t. here:如果使用 RStudio 打开根 R 项目文件 (.Rproj),或者如果通过此 R 项目文件从 RStudio 打开位于此 R 项目文件的文件夹或子文件夹中的任何 R 脚本,则包 here没有用,因为当前工作目录 (getwd()) 已经设置为 R 项目文件目录,并且基本 R 函数 file.path 负责构建与平台无关的(尤其是 wrt 路径分隔符)路径。
    • 如果 R 数据文件 (.RData) 是使用默认 R GUI 打开的(默认情况下应该是这种情况,默认情况下会进行关联),或者如果任何 R 脚本位于文件夹或子文件夹中这个 R 数据文件的文件是通过这个 R 数据文件从默认 R GUI 打开的,然后包 here 也没有用,因为当前工作目录 (getwd()) 已经设置为 R 数据文件目录(但它可能是平台相关 - 尤其是在 Mac 上可能无法运行)并且基本 R 函数 file.path 负责构建与平台无关的(尤其是 wrt 路径分隔符)路径。
    【解决方案3】:

    对我来说,在 RStudio 中通过 Run Selected Line(s) 运行应用程序时,以下内容也适用:

    library(shiny)
    
    # create some local images
    if(!dir.exists("myimages")){
      dir.create("myimages")
    }
    
    myPlotPaths <- paste0("myimages/myplot", seq_len(3), ".png")
    
    for (myPlot in myPlotPaths) {
      png(file = myPlot, bg = "transparent")
      plot(runif(10))
      dev.off() 
    }
    
    myImgResources <- paste0("imgResources/myplot", seq_len(3), ".png")
    
    # Add directory of static resources to Shiny's web server
    addResourcePath(prefix = "imgResources", directoryPath = "myimages")
    
    ui <- fluidPage(
      tags$img(src = myImgResources[1], width = "400px", height = "400px"),
      tags$img(src = myImgResources[2], width = "400px", height = "400px"),
      tags$img(src = myImgResources[3], width = "400px", height = "400px")
    )
    
    server <- function(input, output, session) {
      
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 非常感谢@ismirsehregal(不错的伪BTW :D),感谢您对可重复示例的回答!当我关闭 Internet 连接时,您的代码在我的机器上也可以正常工作。但我不明白你为什么使用addResourcePath?所以在你的代码中,我评论了这一行:addResourcePath(prefix = "imgResources", directoryPath = "myimages") 并用tags$img(src = myPlotPaths[1], width = "400px", height = "400px") 替换了tags$img(src = myImgResources[1], width = "400px", height = "400px")(和其他类似的行),没有互联网它就不再工作了......
    • 所以如果我理解正确(我查看了函数 addResourcePath 文档,但认为它仅适用于包)这个函数 addResourcePath 是在真正的本地路径和闪亮的服务器路径?顺便说一句,我还将您的本地文件夹“myimages”重命名为“www”,并按照上一条消息中的描述运行了修改后的代码,但它也不起作用。虽然(来自函数文档):“www/ 目录下的静态文件在以 / 开头的请求路径下自动可用。”
    • 没错,使用addResourcePath 你可以将本地资源“引入”到网络服务器。通常对于 www 文件夹,这是自动完成的。
    • 关于我在这里的第一条评论,当然关闭或打开互联网连接并不重要......
    • 是的,好主意,谢谢。我刚刚在 RStudio 网站上创建了a new topic。是的,答案被接受:)
    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2011-01-11
    相关资源
    最近更新 更多